Author Archive

{ 2010.9.29 }

as3cryptoで暗号化

    はてなブックマーク - as3cryptoで暗号化
    このエントリーをはてなブックマークに追加

    こんにちは。
    ユニコーン好きのruby使い、ヤマモトです。

    今回は、ActionScriptで暗号化した文字列を、rubyで複合化して受け取る、というのをやります。

    ActionScriptには as3crypto という便利なライブラリが提供されていて、aesやdesなどのアルゴリズムを使用しての暗号化・複合化が可能です。
    code.google.com/p/as3crypto/

    デモページも用意されていて、コードを書く前にあれこれ試すことができます。
    crypto.hurlant.com/demo/

    SecretKeyからデモが行えますが、簡単な説明としては以下のとおりです。

    Encryption : 暗号アルゴリズム選択(AES,3DESなど)
    Mode : 暗号利用モード選択(CBC,CFBなど)
    Padding : 公開鍵暗号技術規格(PKCS#5)

    KeyFormat に秘密鍵を、
    PlainText に変換したい文字列を入力して Encrypto を押すと暗号化された文字列がCipherTextに表示されます。
    このとき、表示モードをText以外にしないと、バイナリデータとして表示されますので、Hex等でシリアライズするのがいいでしょう。

    で、これの実装方法ですが、
    以下の通り書きました。
    前提として、
    秘密鍵 : “hogehoge”
    暗号化する文字列 : “fugafuga”
    暗号アルゴリズム : AES
    暗号利用モード : ECB
    を使用します。

    as側

    public function encrypt(str:String):ByteArray {
    	var e:ByteArray = new ByteArray();
    	var key:ByteArray = Hex.toArray(Hex.fromString("hogehoge"));
    	var src:ByteArray = Hex.toArray(Hex.fromString(str));
    	var pad:IPad = new PKCS5();
    	var cipher:ICipher = Crypto.getCipher("aes-ecb", key, pad);
    	pad.setBlockSize(cipher.getBlockSize());
    	cipher.encrypt(src);
    	e.writeObject(src);
    	return src;
    }

    これで、

    encrypt_data = encrypt("fugafuga")

    で暗号化の文字列がバイナリで返されます。
    これを、Base64コードに変換してXMLにてrubyに渡し、復号化を行ないます。

    rubyではOpenSSL::Cipherクラスを使用して復号化を行ないますが、
    その前に、受け取るデータのデシリアライズをしなくてはいけません。
    as側で、暗号化文字列をBase64コードに変換していましたので、これを元に戻します。

    require 'base64'
    # encrypt_data = 暗号化された文字列
    encrypt_data_byte = decode64(URI.decode(encrypt_data))

    あとは以下の要領で復号化です。

    def decrypt(data, key)
        c = OpenSSL::Cipher::Cipher.new("aes-128-ecb")
        begin
          c.decrypt
          c.key = "hogehoge"
          c.update(data) + c.final
        rescue Error => e
          logger.error("#{e.message}")
        end
      end
     
    # 復号化された文字列
    decrypt_data = decrypt(encrypt_data_byte)
     
    puts decrypt_data
    ⇒ "fugafuga"

    ロジック中にアルゴリズムや秘密鍵を直接指定していますが、
    そこは定数化などで汎用的にしてください。

    今回は、as・ruby間で行ないましたが、JavaやObjective-Cでも可能です。

      はてなブックマーク - Rails3 で restful-authentication
      このエントリーをはてなブックマークに追加

      こんにちはヤマモトです。
      rails3の正式リリースもなされ、いよいよ実案件での運用も視野に入り始めてきました。

      今回は、Ruby on Rails3で、restful-authenticationは動くのか、というのを取り上げます。

      restful-authenticationとは、サイトのユーザー認証機構を組み込むのには便利なプラグインです。
      ユーザー登録、ログイン、ログアウト用のviewファイルや、
      ユーザー用モデル生成、メールアクティベート、ログイン保持などの機能を一気に提供してくれるので大変重宝しています。

      まずは、プロジェクトを生成します。
      なお、rubyは1.9.2(RVM)です。

      rails new sample

      (旧 rails sample)
      でプロジェクトが作成されます。

      そして、db:createもせずにとりあえず起動。

      rails s

      (旧 ruby script/server)

      ところが

      Could not find gem 'sqlite3-ruby (>= 0, runtime)' in any of the gem sources.

      のエラー。

      プロジェクト作成時はデフォルトでsqlliteが指定されるのは従来と変わりませんね。
      ということで、config/database.yml内のsqlite表記部分を、postgresへ変更。
      しかし、それでも上記のエラーが出続けます。
      従来であればここを変えればよかったのですが、設定箇所が別のファイルに移ったのでしょうか。
      とりあえず、データベースを指定して作りなおします。

      rails new sample -d postgresql

      すると次のエラーが。

      LoadError (no such file to load -- openssl)

      OpenSSLは使ってないはずですが必要のようですね。

      CentOSを使用したので、
      yum install openssl openssl-devel
      ※debian系は適宜読み替えてください。

      あとはインストールです。

      ruby ~/.rvm/src/ruby-1.9.2-p0/ext/openssl/extconf.rb
      make && make install

      さて、これでようやく
      「Welcome aboard」
      の画面が表示されました。

      では、restful-authenticationを導入してみます。
      導入方法の詳細は様々なページでご紹介されているので詳しくは割愛します。

      まず、restful-authenticationがrails3に対応しているかですが、以下から提供されているようです。
      github.com/Satish/restful-authentication

      状態管理をサポートするacts_as_state_machineや、パスワード再発行に便利なforget_passwordは従来のままで使えそうです。

      aasm

      gem sources -a http://gems.github.com
      gem install rubyist-aasm

      forget_password

      ruby script/plugin install git://github.com/greenisus/forgot_password.git

      そして、ジェネレート。

      rails g authenticated user sessions --include-activation --aasm

      modelやview、controllerが生成されます。

      では、ユーザー登録を行ってみます。

      hostname/signup

      でユーザー登録ページへアクセス。

      すると、

      uninitialized constant UsersController::AuthenticatedSystem

      AuthenticatedSystemが読み込まれてないとのエラーが。
      ここでrails3の洗礼です。
      rails3はlib以下のファイルを自動でロードしてくれません。
      今まではlib以下に作られるauthenticated_system.rbを自動でincludeしてくれていました。
      rails3では、明示的に記述しないといけません。

      記述場所はconfig/initilizer以下にcustom_requires.rbというファイルを作成して

      require 'authenticated_system.rb'

      と記述。

      これでようやくユーザー登録ページが開き、実行することができました。

        はてなブックマーク - OpenOfficeとpopplerを使用した画像変換処理
        このエントリーをはてなブックマークに追加

        またまた山本です。
        以前ご紹介した自社サービスのZENPREの反響が思いのほか大きく、とりあえずほっとしております。
        いいスタートダッシュは切れたので、引き続き新たな機能の実装を続けてまいります。

        今回はZENPREで使用している機能の1つを紹介させていただきます。

        ZENPREではアップロードされたMicrosoftOfficeのPowerPointのデータやPDFを画像変換することで、Flashを通しての配信を可能にしておりますが、
        この時のフローとしては、3つの段階を経ています。

        OpenOffice + JODConverterでppt,pptxファイルをpdfファイルへ変換(省略可)

        poppler(Xpdf)を使用して、pdfファイルをppmファイルへ変換

        ImageMagickを使用して、ppmファイルをjpgへ変換

        つい最近まで、OpenOfficeのバージョンは3.2.0でした。
        このバージョンでは、Office2007の形式である「pptx」も変換可能なのですが、
        1枚目に表示される「クリックしてサブタイトルを入力」というガイドまでも変換されてしまうというバグがありました。
        しかし、最近バージョンが3.2.1にあがりその問題が解消されましたので、晴れて「pptx」にも対応いたしました。

        開発段階においては、2番目のフローである「pdf→ppm」変換をせず、
        「pdf→jpg」変換を行っておりました。
        しかし、この変換方法だと生成される画像の解像度が低いという問題がありました。
        600×480ほどのサイズであれば問題なく、表示もそれに合わせればよいのですが、ZENPREの機能の一つにフルスクリーンモードというのがあり、
        それを使用すると利用者によってはとてつもなく大きいモニターで表示することになり、
        その場合、画像が引き伸ばされぼやけてしまうことになります。

        そこで着目したのがpopplerでした。
        popplerの前身はXpdfであり、pdfをppmという高解像度の画像へ変換することが可能です。

        以下は、ppmに変換せずに生成したjpgとppmに変換した上で生成したjpgの2ファイルです。
        ppm処理しないjpg
        ppm処理したjpg

        前者は粗さが目立ちますが、後者は文字の縁が滑らかなまま表示されています。
        もちろんファイルサイズが大きくなってしまいますが、大した負荷ではないので採用することにしました。

        インストールは、Redhat系をご使用であればyumインストールで使用可能なのですが、
        yumだと肝心のpdfをppmに変換する機能である、「pdftoppm」が含まれてません。

        情報が少なくて、pdftoppmを導入する方法がなかなかわからなかったのですが、
        popplerをyumインストールするのではなく、ソースからインストールすることで解決しました。
        Poppler

        課題としては、全体的に変換に時間がかかるということです。
        pdf変換においても結構時間がかかるのですが、その上にppm変換を挟んでいるのでどうしても短縮が困難です。
        pptの変換サービスとしては有名なところでSlideshareがあると思いますが、
        この変換速度はかなりなものだと思います。

        これに近づけたらと思います。