2008年7月6日日曜日

RubyとPythonとPHPで暗号化を行うためのメモ

Google App Engineでアプリケーションを開発中に、MD5で暗号化したURLをDatasotreに格納しようとしたら"UnicodeDecodeError / 'ascii' codec can't decode byte 0xe7 in position 3: ordinal not in range(128)"と怒られたのでちょっと調べてみました。

せっかくだからPythonとRubyとPHPで暗号化に関する関数/メソッド(MD5とかSHA-1)の使い方を比較。
MD5もSHA-1も言語ごとの使い方は基本的に同じですね。

Python
マニュアル:
md5 -- MD5 メッセージダイジェストアルゴリズム
SHA-1 メッセージダイジェストアルゴリズム

import md5
print md5.new("some text").digest()


上記のエラーはこのdigestメソッドの返り値を格納しようとして発生しました。
マニュアルにもあるようにdigest()メソッドは「nullバイトを含む非 ASCII 文字が入っているかもしれません。」ということなので、非ASCIIが混入していたのでしょう。
digest()メソッドをhexdigest()メソッドに変更したらエラーはなくなりました。
実はdigest()とhexdigest()の違いなんて意識したことなかったので(!)最初は何のことか分かりませんでした。


Ruby
マニュアル:
Digest::Base

require 'digest/md5'
p Digest::MD5.hexdigest(File.open('ruby-1.8.5.tar.gz','rb').read)

# => "3fbb02294a8ca33d4684055adba5ed6f"


Rubyにもdigest()メソッドとhexdigest()メソッドがあります。


PHP
md5
sha1

使い方は一番シンプル。関数を呼び出すだけ。
$str = 'apple';

if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "Would you like a green or red apple?";
exit;
}
?>


python,rubyのhexdigest()メソッドと同等の関数なのでしょうか。
第二引数にTrueを指定するとバイナリ形式で返ってくるようです。(digestと同等?)

0 件のコメント: