3

一部のデータを暗号化するために Security::cipher を使用する cakephp アプリケーションで作業しています。完全に機能しますが、ファイルと DB を別のサーバーに移動したため、暗号化された結果が異なります。私はいくつかの単純な行で試しました:

$security = new Security;
$code = $security->cipher('1234', Configure::read('Security.cipherSeed'));

$code を出力すると、両方のサーバーで値が異なります。両方の core.php ファイルで同じ Security.cipherSeed を構成しました。Security::cipher 関数はサーバー値を使用して暗号化していますか?

ありがとうございました。

4

1 に答える 1

6

さて、このバグを見ると、問題のようです。

ソースコードを掘り下げると、この行が機能します。

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

代わりに、 MCryptGPGなどの実際の暗号化ライブラリを使用してください。

編集:このトピックに関するバグ レポートを Cake に送信しました。

于 2011-02-10T13:53:37.357 に答える