Я вижу какое-то странное поведение с методами openssl_*
в PHP. В 50% случаев он будет терпеть неудачу, бросая Unknown cipher algorithm
, а остальные 50% времени будут правильно кодировать мои данные. Вот соответствующий фрагмент из моего кода:
$iv = openssl_random_pseudo_bytes(16);
$hash = openssl_encrypt($raw, "AES-128-CBC", $hashing_secret, OPENSSL_RAW_DATA, $iv);
// send $iv.$hash
с помощью openssl_get_cipher_methods
дает мне:
[0] => AES-128-CBC
...
[81] => aes-128-cbc
поэтому я знаю, что шифры доступны. Кроме того, $ openssl ciphers
отображает AES-128-CBC как доступный шифр на системном уровне (однако мне сказали, что PHP в комплекте openssl независим)
Я запускаю Ubuntu 14.04, php5.5.9-1ubuntu4.14, openssl 1.0.1f 6 января 2014 года (версия, указанная в phpinfo, такая же). Если это актуально, весь этот код работает под инфраструктурой Silex через nginx/php-fpm.
Обновление: немного больше информации...
Я провел еще несколько тестов. Я написал небольшой script, который просто зацикливается на x раз, кодируя некоторые данные.
set_error_handler(function() use (&$errorCount) {
$errorCount++;
});
for ($i = 0; $i < $numTests; $i++) {
$hash = openssl_encrypt($data, "AES-128-CBC", $hashing_secret, OPENSSL_RAW_DATA, $iv);
}
Если я запустил это (через php test.php
) на том же сервере, он будет работать последовательно - т.е. $errorCount == 0
каждый раз. Это заставляет меня поверить в это: a) silex или b) процесс fastcgi, который препятствует функции - я добавил теги.
Не совсем уверен, куда идти отсюда, теперь, хотя...
Второе обновление
Я сделал немного больше тестов. Я запустил тест script за nginx, запустив php-fpm. Странная вещь здесь заключается в том, что либо: а) она терпит неудачу в 100% случаев, либо b) она не работает 0 раз, а не немного из обоих результатов. Это заставляет меня думать, что это nginx или php-fpm, что виновник.