Ну, глядя на эту ошибку , похоже, это проблема.
Копаясь в исходный код , эта строка заставляет его работать:
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 .
Редактировать: Я отправил сообщение об ошибке по этой теме на торт.