アカウント名:
パスワード:
例えば、javaの乱数生成のドキュメントでもセキュリティ目的では使用できず、安全なSecureRandomの使用を進めているけど [oracle.com]、
使用する部品の仕様書を逐一確認するのは大変だし、ましてやセキュリティ関連になると、ますます難しい。
セキュリティで食っている会社でもなきゃ、そういったミスは仕方ないんじゃないかなね?カスペルスキーさん トレンドマイクロさん [security.srad.jp]
いや、この脆弱性の本質は、非暗号論的な疑似乱数(今回のケースではメルセンヌ・ツイスタ)を使ったことではなくて、その種がシステム時刻でしかなく、それによって推測しやすくなっていたことでは。
php で言えば、ほとんどの人は mt_rand をそのまま使っていると思いますね。
mt_rand ではランダムの種に現在時刻とプロセスIDを使っているということです(参考資料 [lovepeers.org])ので時刻だけよりかはだいぶマシですが、もっとバレにくくするにはコレ [hatenablog.com]とか参考になると思います。
いやー、実は私も、この事件を知って始めて openssl_random_pseudo_bytes を知った。あぶねー、あぶねー。
mt_randは暗号論的乱数として使えるように設計されていないから使ってはいけないというのは常識だと思ってた
常識と言ってもここ数年くらいのことじゃないですかねそもそも openssl_random_pseudo_bytes が使えるようになったのがPHP 5.3以降(2009年リリース)なのでPHPの全盛期に作られたプログラムやその頃に学んだ人は mt_rand しか知らない
2000年頃に作った俺のプログラムが確か独自のセッションIDを生成してMySQLに入れていたなと思ってコード見てみたが、OSコマンドを発行して /dev/urandom を乱数生成器として使用していた。
2000年頃と書いたけど、コメントに日本語版正式公開前のUS版IE7でのテスト結果が書かれていたので2006年10月頃のコードだった# あの頃はgitでバージョン管理とかしていなかったからいつのデータかコードをよく見ないと分からない
暗号学的乱数が必要な場面をそうと判断できる人は、言語組み込みの汎用乱数をそのまま使ったりはしない。ライブラリか外部モジュールに投げるかスクラッチする。
言語組み込みでの実装が提供されるくらいになったのは比較的最近、と評すべきだろうなその事例は。
常識だと思うのは、まずい、暗号には使うなって書いてあっても、動けばいいと思ってる人とか、気にしない人も結構数がいる。常識と思ってると他の人も正しく処理してくれていると思ってしまう
PHP 7以降であれば、random_bytesおよびrandom_intという選択肢もあります。
https://www.php.net/manual/ja/ref.csprng.php [php.net]
いやこれ単なる嫌味じゃろ
その嫌味が間違ってて嫌味になってないって指摘じゃない乱数生成アルゴリズムが適切に選択されてないって指摘に、よく見かける seed bit 分の空間しか持ってないってミスじゃないかという指摘とっちが正しいのかは流し読みしかしてないから知らん
この前のスクエニの人?
間違ってるも何も単によくある誤りの例示であって今回の話じゃないやろ
「じゃないやろ」
アホ?
いやいやそういう技術的な話じゃなくて
カスペルスキーはセキュリティ関連企業じゃないからそんな専門的なこと知らなくても仕方ないよね、って話なのでは
よくはしらんけど、/dev/randomにあたるものってWindowsにないのか、使いづらいの?
いや、種にたかだか32ビットの整数1つしか使うことのできないメルセンヌ・ツイスターは根本的に暗号論的な疑似乱数として使うことは不可能
32bitsのseedでは小さい。もっと大きな初期値空間が欲しい。 2002年版mt19937ar.cの 初期化ルーチンには、符号なし一ワードのseedにより 初期化を行うinit_genrand(seed)のほかに、 符号なしワードの配列init_key[]からkey_length個の 数値を取り出し、変換してMTの状態配列とする初期化ルーチン init_by_arrayがあります。これにより、任意長の配列を 初期値として用いることができます。
32bitsのseedでは小さい。もっと大きな初期値空間が欲しい。
2002年版mt19937ar.cの 初期化ルーチンには、符号なし一ワードのseedにより 初期化を行うinit_genrand(seed)のほかに、 符号なしワードの配列init_key[]からkey_length個の 数値を取り出し、変換してMTの状態配列とする初期化ルーチン init_by_arrayがあります。これにより、任意長の配列を 初期値として用いることができます。
http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/faq.html [hiroshima-u.ac.jp]
お前、絶対に分かっててボケ入れてるだろ…付き合ってあげるけどさ。
32ビット版メルセンヌ・ツイスタは(624+1)×32ビットの内部ベクトルを持つ。だから20000ビットのシードで初期化できる。今回みたいな利用ケースなら、適切に初期化すれば12文字のあらゆる組み合わせが生成できるはずなの。暗号論的疑似乱数でないことはここでは問題にならないの。まあ、20000ビットもの予測困難なシードが得られるんなら、メルセンヌ・ツイスタなんか使わずにそのシードをパスワードに変換すればいいのにって話なんだけどね。12文字のパスワードなんて100ビットも情報ないんだから
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
吾輩はリファレンスである。名前はまだ無い -- perlの中の人
これは仕方がないミス (スコア:3, おもしろおかしい)
例えば、javaの乱数生成のドキュメントでも
セキュリティ目的では使用できず、安全なSecureRandomの使用を進めているけど [oracle.com]、
使用する部品の仕様書を逐一確認するのは大変だし、
ましてやセキュリティ関連になると、ますます難しい。
セキュリティで食っている会社でもなきゃ、そういったミスは仕方ないんじゃないかな
ね?カスペルスキーさん トレンドマイクロさん [security.srad.jp]
Re:これは仕方がないミス (スコア:2, すばらしい洞察)
いや、この脆弱性の本質は、非暗号論的な疑似乱数(今回のケースではメルセンヌ・ツイスタ)を使ったことではなくて、
その種がシステム時刻でしかなく、それによって推測しやすくなっていたことでは。
Re:これは仕方がないミス (スコア:2)
php で言えば、ほとんどの人は mt_rand をそのまま使っていると思いますね。
mt_rand ではランダムの種に現在時刻とプロセスIDを使っているということです(参考資料 [lovepeers.org])ので時刻だけよりかはだいぶマシですが、もっとバレにくくするにはコレ [hatenablog.com]とか参考になると思います。
いやー、実は私も、この事件を知って始めて openssl_random_pseudo_bytes を知った。
あぶねー、あぶねー。
Re: (スコア:0)
mt_randは暗号論的乱数として使えるように設計されていないから使ってはいけないというのは常識だと思ってた
Re: (スコア:0)
常識と言ってもここ数年くらいのことじゃないですかね
そもそも openssl_random_pseudo_bytes が使えるようになったのがPHP 5.3以降(2009年リリース)なので
PHPの全盛期に作られたプログラムやその頃に学んだ人は mt_rand しか知らない
それはレベルが低いだけ (スコア:0)
2000年頃に作った俺のプログラムが確か独自のセッションIDを生成してMySQLに入れていたなと思ってコード見てみたが、OSコマンドを発行して /dev/urandom を乱数生成器として使用していた。
2006年だった (スコア:0)
2000年頃と書いたけど、コメントに日本語版正式公開前のUS版IE7でのテスト結果が書かれていたので2006年10月頃のコードだった
# あの頃はgitでバージョン管理とかしていなかったからいつのデータかコードをよく見ないと分からない
Re: (スコア:0)
暗号学的乱数が必要な場面をそうと判断できる人は、
言語組み込みの汎用乱数をそのまま使ったりはしない。
ライブラリか外部モジュールに投げるかスクラッチする。
言語組み込みでの実装が提供されるくらいになったのは比較的最近、
と評すべきだろうなその事例は。
Re: (スコア:0)
常識だと思うのは、まずい、暗号には使うなって書いてあっても、動けばいいと思ってる人とか、気にしない人も結構数がいる。
常識と思ってると他の人も正しく処理してくれていると思ってしまう
Re: (スコア:0)
PHP 7以降であれば、random_bytesおよびrandom_intという選択肢もあります。
https://www.php.net/manual/ja/ref.csprng.php [php.net]
Re: (スコア:0)
いやこれ単なる嫌味じゃろ
Re: (スコア:0)
その嫌味が間違ってて嫌味になってないって指摘じゃない
乱数生成アルゴリズムが適切に選択されてないって指摘に、よく見かける seed bit 分の空間しか持ってないってミスじゃないかという指摘
とっちが正しいのかは流し読みしかしてないから知らん
Re: (スコア:0)
この前のスクエニの人?
Re: (スコア:0)
間違ってるも何も単によくある誤りの例示であって今回の話じゃないやろ
Re: (スコア:0)
「じゃないやろ」
Re: (スコア:0)
アホ?
Re: (スコア:0)
いやいや
そういう技術的な話じゃなくて
カスペルスキーはセキュリティ関連企業じゃないから
そんな専門的なこと知らなくても仕方ないよね、って話なのでは
Re: (スコア:0)
よくはしらんけど、/dev/randomにあたるものってWindowsにないのか、使いづらいの?
Re:これは仕方がないミス (スコア:1)
/dev/*random ほどお手軽ではないらしいことがわかりました
Re: (スコア:0)
いや、種にたかだか32ビットの整数1つしか使うことのできないメルセンヌ・ツイスターは根本的に暗号論的な疑似乱数として使うことは不可能
Re:これは仕方がないミス (スコア:1)
http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/faq.html [hiroshima-u.ac.jp]
Re: (スコア:0)
お前、絶対に分かっててボケ入れてるだろ…
付き合ってあげるけどさ。
32ビット版メルセンヌ・ツイスタは(624+1)×32ビットの内部ベクトルを持つ。
だから20000ビットのシードで初期化できる。
今回みたいな利用ケースなら、適切に初期化すれば12文字のあらゆる組み合わせが生成できるはずなの。暗号論的疑似乱数でないことはここでは問題にならないの。
まあ、20000ビットもの予測困難なシードが得られるんなら、メルセンヌ・ツイスタなんか使わずにそのシードをパスワードに変換すればいいのにって話なんだけどね。
12文字のパスワードなんて100ビットも情報ないんだから