« ホワイトリストと出力Webセキュリティ - 正しい認識が必要 »

6 コメント

コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
Stefan氏が作っている守護神モジュールではビット幅を64bitに拡張したり、srand/mt_srandを利用せず強制的に自動的に乱数生成器を初期化するようになっているようです。

64bitに拡張する事によりルックアップテーブルの作成はかなり困難になりますが、擬似乱数をそのまま出力してしまう設計は行わない方が良いでしょう。
2008/09/24 @ 12:22
コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
mt_srandのPHPマニュアルに間違いがあります。

Since 5.2.1 The Mersenne Twister implementation in PHP now uses a new seeding algorithm by Richard Wagner. Identical seeds no longer produce the same sequence of values they did in previous versions. This behavior is not expected to change again, but it is considered unsafe to rely upon it nonetheless.


php -r "mt_srand(1234); echo mt_rand(0, 100000);"

等とすれば分かりますが、同じ乱数が生成されます。この記述はPHP 4.2.0以降のPHPでは時間とプロセスIDを利用したphp_combind_lcg関数(PHPの内部関数)によって自動的に初期化される仕様と混同(?)している可能性があります。
2008/09/24 @ 12:38
コメント from: sanaki [訪問者]
mcrypt_create_iv() はどうですか?
2008/09/25 @ 10:12
コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
> mcrypt_create_iv() はどうですか?

プロトタイプは

mcrypt_craete_iv(int size[, int source])

で、sourceには/dev/random(MCRYPT_DEV_RANDOM), /dev/urandom(MCRIPYT_DEV_URANDOM)を利用できますが、ソースを指定しない(MCRYPT_RANDOM)とphp_rand(libcのrandのラッパー。初期化は自動的に行われる)が利用されます。

sizeで指定した分だけのデータをrandom/urandomから読み出します。MCRYPT_RANDOMの場合、ループになっていてsizeの回数だけphp_randを呼んでInitilization Vectorを作成します。

MCRYPT_RANDの場合、mt_randの方を呼んだ方が良いと思いますが、初期化の方法としては妥当と言えると思います。
2008/09/25 @ 15:26
コメント from: mrkn [訪問者]
***--
MT に限らず、非暗号論的乱数はセキュリティに関わる部分で用いないほうが良いですよね。
2008/09/26 @ 18:03
コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
> MT に限らず、非暗号論的乱数はセキュリティに関わる部分で用いないほうが良いですよね。

その通りですが現実的にはランダムパスワードの生成などに疑似乱数が使われている事が多いと思います。

個人的には、ランダムパスワードの生成には/dev/urandomから200バイトほど読み取り、SHA1などでハッシュと取り、その一部を切り出す方法が好みです。
2008/09/28 @ 13:37

コメントを残す


Your email address will not be revealed on this site.

頂いたURLは表示されます。
PoorExcellent
(改行が自動で <br /> になります)
(Name, email & website)
(ユーザに、メッセージ・フォームを通じた連絡を許可します (あなたのメール・アドレスは表示されません))