• ベストアンサー

MD5について

perlでmd5化したパスワードをpostgreSQLに格納し、認証時に使用するような処理をしています。 色々と当たってみると、md5化されたパスワードは半角英数の文字列になるようなのですが、実際にDBに登録されている文字列をteratermでselectしてみると2バイト文字(こんな感じ→`Tz祀・旅[綻)として見えます。 そんなことってあるんでしょうか? PostgreSQL7.4でDBのエンコードはSQL_ASCII。 teratermはEUCのまま使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • struct
  • ベストアンサー率72% (32/44)
回答No.1

PostgreSQLを知らないので抜けがあるかもしれませんが、 おそらくバイナリとテキストの違いでそう見えるのでしょう。 「md5化されたパスワードは半角英数の文字列」とありますが 正確には128ビットの長さの0と1です。 これをコンピュータの1バイトにめいいっぱい割り当てると 128÷8で、16バイトのデータになります。 このデータはテキストではなくバイナリなので、 無理やり文字(Shift_JIS)として画面に表示させると、 l5コ・q:・連」ナォキ{ のように見えます。 人間が目で見て比較する場合、 128個の0と1を比較するわけにはいきませんから、 ハッシュ値を128桁の2進数と見て、 それを16進数に変換します。 そうすると32桁になり少しは比較しやすくなります。 使う数字は0123456789abcdefの16個で、 一例を挙げると、 6c35bafcb0713aeb439841a3c5abb77b といった感じです。 通常よく見かける表記はこちらでしょう。 最後にSQLの結果を16進数表記にするにはどうしたらいいのかという疑問がわくかもしれませんが、 画面をリダイレクトか何かでファイルに落とし、 バイナリエディタで見るぐらいしか思いつきませんでした。

northwind3
質問者

お礼

結局は同じものとして考えてよいわけですね。 なるほど。 ありがとうございました。

その他の回答 (1)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。概ね#1さんが回答されているので、補足を。 バイナリ情報であれば、BASE64というエンコードも便利です。googleあたりでお調べになってみるとよろしいかと。 あと、MD5は、身内で「マジでダメになる5秒前っていうかダメ」って冗談を言っているくらい、ハッシュ関数としてはNGな方式です。 sha-1…が良いかどうかは微妙ですが、MD5よりはマシですので。せめてもsha-1になさることをお勧めいたします。

northwind3
質問者

お礼

そうなんですかー。 もうすでにサービスが稼動してしまっているので簡単ではないかもしれませんが、検討事項としてsha-1への移行も考えておきます。 ありがとうございます。

関連するQ&A