[PHP-users 28622] Re: MD5の仕組みについて
Yasuo Ohgaki
yohgaki @ ohgaki.net
2006年 3月 4日 (土) 06:41:14 JST
大垣です。
Kouichi Matsumoto wrote:
> こんにちは。松本です。
>
> 会員制サイトでログインを省略する為、ログイン情報を
> 永続クッキーにデータを保存しようと思います。
> 可逆暗号を使おうと思いましたが、
> パスワードを可逆暗号してクッキーに保存するのもセキュリティ上
> あまり好ましくなさそうなので、暗号キーを生成しようと思いました。
セキュリティのベストプラクティスとしては、このような用途には
*予測不可能なランダムな文字列のみ*を利用すべきです。
書かれてるように暗号化してパスワードをクッキーに保存するのは最悪の方法
です。セキュリティ上重大な問題になります。
# 気になる場合はreplay attack等で検索してください。
>
> echo md5('メールアドレス'+'何か');
上記は良くない例の一つになります。一部にでも予測可能な文字列は含まない
よういするべきです。prefix程度ならまだ良いですがメールアドレスやアカウ
ント名などのは絶対に含めてはならない情報です。
> であればメールアドレスがユニークである限り
> ユニークの文字列となるのでしょうか?
確立的にはユニークであるという前提で普通は問題ないです。
> 過去ログを拝見しますと、md5は無限の事象を有限の長さに写すとあるので、
> ユニークになるとは限らず生成した後に重複チェックをしないと
> ユーザー毎に一意とすることはできないでしょうか?
確立的には必要と思われていません。
> PHPのセッションIDも生成時に重複チェックをしているのでしょうか?
していません。
気になる場合はPHP5を使ってSHA1にするとコリージョンの可能性は大幅に減少
します。MD5は128bit, SHA1は160bitの強度です。PHP5ならSHA1はデフォルトで
利用可能なのでわざわざ強度の弱いハッシュ関数を利用する必要はないのでSHA1
を利用するべきです。
念のために書きますが、md5('user @ example.com')やsha1('user @ example.com')等
のハッシュ値をユーザのログイン状態を確認するキーとしては使用してはいけませ
ん。必ずsha1(mt_rand(0, 9999999).microtime())等のランダムな値のみキーとして
使用します。精神衛生上必要であればこの生成したキーを使用済みキーと比較して
コリージョンをチェックすればよいです。このようなログイン状態を記憶するキー
はログインする度に更新するべきです。また、数週間程度で無効になるような仕様
にするべきです。
# ユーザをトラッキングするキーなら固定でかまわないですが、認証関係の
# キーは更新が可能な時点で更新する仕組みを実装しておかなければならない
# です。
セッション管理はSHA1までしかサポートしていませんが、SHA256、SHA512などが
hashモジュールではサポートされています。
Array
(
[0] => md4
[1] => md5
[2] => sha1
[3] => sha256
[4] => sha384
[5] => sha512
[6] => ripemd128
[7] => ripemd160
[8] => whirlpool
[9] => tiger128,3
[10] => tiger160,3
[11] => tiger192,3
[12] => tiger128,4
[13] => tiger160,4
[14] => tiger192,4
[15] => snefru
[16] => gost
[17] => adler32
[18] => crc32
[19] => crc32b
[20] => haval128,3
[21] => haval160,3
[22] => haval192,3
[23] => haval224,3
[24] => haval256,3
[25] => haval128,4
[26] => haval160,4
[27] => haval192,4
[28] => haval224,4
[29] => haval256,4
[30] => haval128,5
[31] => haval160,5
[32] => haval192,5
[33] => haval224,5
[34] => haval256,5
)
--
Yasuo Ohgaki
http://blog.ohgaki.net/
http://wiki.ohgaki.net/
PHP-users メーリングリストの案内