データのハッシュ化とか暗号化の入門メモ
暗号化とかハッシュとかの入門情報をメモしておきます。
奥が深いですねぇ。
パスワードを保存する場合
ウェブ上のサービスを提供する場合に、ユーザーのパスワードを保存する時、具体的にどうするのが正しいのでしょうか。
平文で保管するのは論外として、暗号化?ハッシュ?
ここの記事、及び関連記事が大変ためになりました。
▽[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 を使う限り同じ結果となります。
という問題がある。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
ここらへん、一度やりはじめたら同じ手法を使うせいか、入門レベルの情報が少ないですね。
私のレベルでは一度読んだだけでは理解できず、大変でした。ちゃんと動くものを書けるでしょうか……(汗)