Зависит ли Security: зашифрованный результат от сервера? - PullRequest
3 голосов
/ 10 февраля 2011

Я работаю в приложении CakePHP, где я использую Security :: cipher для шифрования некоторых данных.Это работает отлично, но я переместил файлы и БД на другой сервер, и теперь зашифрованный результат отличается.Я пробовал с несколькими простыми строками:

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

Когда я печатаю $ code, значение на обоих серверах разное.Я настроил один и тот же Security.cipherSeed в обоих файлах core.php.Использует ли функция Security :: cipher какое-либо серверное значение для шифрования?

Спасибо.

1 Ответ

6 голосов
/ 10 февраля 2011

Ну, глядя на эту ошибку , похоже, это проблема.

Копаясь в исходный код , эта строка заставляет его работать:

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 .

Редактировать: Я отправил сообщение об ошибке по этой теме на торт.

...