データのハッシュ化とか暗号化の入門メモ

暗号化とかハッシュとかの入門情報をメモしておきます。
奥が深いですねぇ。



パスワードを保存する場合

ウェブ上のサービスを提供する場合に、ユーザーのパスワードを保存する時、具体的にどうするのが正しいのでしょうか。
平文で保管するのは論外として、暗号化?ハッシュ?


ここの記事、及び関連記事が大変ためになりました。


▽[PHP]パスワードのハッシュ化にはcrypt を使ってはいけない(ブログが続かないわけ)
 http://en.yummy.stripper.jp/?eid=1154637


私が理解した要点は以下のとおり(長いけど)


1.パスワードは、復号できる暗号化をするのではなくハッシュ化して保管する(一方向暗号化)
 →復号を前提としていないから、正しいパスワードを知る本人以外ハッシュ値を一致させることは通常困難(内部からの漏洩防止に役立つ)


2.(1)ハッシュ値が漏洩、(2)元のデータとハッシュ値の辞書を準備、(3)漏洩したハッシュ値と前記辞書から、元のデータが判明ということ(レインボーテーブル?)を防止するため、saltを組み合わせて特定を困難にすべき


3.cryptはsaltを自動生成する機能があって便利。ただし

標準の DES ベースの暗号化の場合、crypt() は出力の最初の 2 文字を salt として使用します。また、 str の最初の 8 文字しか使用しません。 つまり、最初の 8 文字が同じである長い文字列は、 同じ salt を使う限り同じ結果となります。

▽crypt
 http://jp2.php.net/manual/ja/function.crypt.php

という問題がある。9文字以上のパスワードにしても意味がないことになる。


4.そこでsha1とsaltを組み合わせて使うという方法がある(sha1単独だと再度レインボーテーブル問題にみまわれるから)。
 cryptでsaltを自動生成して、組み合わせるという方法が紹介されている。ただしsaltを個々に保存しないといけない点をどうとらえるか(他の値をsaltとして使うという方法もある)


sha1
 http://jp2.php.net/manual/ja/function.sha1.php

▽パスワードの保存に SMD5 (Salted MD5) や SSHA1を使う (MD5 への辞書攻撃とか)
 (まちゅダイアリー)
 http://www.machu.jp/diary/20071023.html


そもそも普通のハッシュ関数を、パスワードハッシュに用いるべきでない、用途が違うという指摘もありました。あ、頭が痛い……


パスワード以外の情報を暗号化したい場合

パスワードと異なり、復号を前提とした暗号化をすることになります。
原則復号できないから、ハッシュにしたら駄目。


2年前の記事だけど、これが定番ぽい。


PHPで暗号化・復号あれこれ(ウノウラボ
 http://labs.unoh.net/2007/11/php_de_crypt.html


手っ取り早くできそうなmcrypt_genericでアプローチをすることにします。


上の記事のソースそのままで動作することを確認します(動作する環境であればそのまま実行できるソースです)。
その上で、下の記事に書かれている注意事項やソースを参考にしつつ、組み込めばOKぽいです。


PHPの調べ物:暗号化-mcrypt(美味しいもの)
 http://blogs.yahoo.co.jp/airmikan/20159036.html


▽「PHPで暗号化・復号あれこれ」の続き(Do You PHP はてな
 http://d.hatena.ne.jp/shimooka/20071108/1194449912


ここらへん、一度やりはじめたら同じ手法を使うせいか、入門レベルの情報が少ないですね。
私のレベルでは一度読んだだけでは理解できず、大変でした。ちゃんと動くものを書けるでしょうか……(汗)