さて、このバグを見ると、問題のようです。
ソースコードを掘り下げると、この行が機能します。
srand(Configure::read('Security.cipherSeed'));
では、なぜそれが機能するのでしょうか。rand()
疑似乱数アルゴリズムを実装しているためです。したがって、任意の既知のシードに対して、理論的には同じ一連のランダム出力を生成できます。これが機能するかどうかを確認するために、特に内部関数の PHP ソース コードを見てみましょう。rand()
php_rand
PHPAPI long php_rand(TSRMLS_D)
{
long ret;
if (!BG(rand_is_seeded)) {
php_srand(GENERATE_SEED() TSRMLS_CC);
}
手動でシードしているため、これが問題ではないことはわかっています (サーバーに suhosin パッチがインストールされていない限り、常に再シードされるため、機能しません)。
#ifdef ZTS
ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
ret = random();
# elif defined(HAVE_LRAND48)
ret = lrand48();
# else
ret = rand();
# endif
#endif
うわー、何が起こったのか見ましたか?サーバーの仕様に応じて、4 つの異なるランダム ライブラリ (、、rand()
または独自の内部ランダム関数)のいずれかrandom()
を使用できます。そのため、サーバーのインストール間で移植できません。 lrand48()
php_rand_r
代わりに、 MCryptやGPGなどの実際の暗号化ライブラリを使用してください。
編集:このトピックに関するバグ レポートを Cake に送信しました。