我在 PHP 的 openssl_*
方法中发现了一些奇怪的行为。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 Jan 2014 (在phpinfo中列出的版本是相同的)。如果有关的话,所有这些代码都通过nginx/php-fpm在Silex框架下运行。
更新:更多信息...
我做了更多测试。我编写了一个小脚本,只是循环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进程阻碍了该函数——我已经添加了这些标记。
现在不太确定该往哪里走了...
第二次更新
我进行了更多测试。我将测试脚本放在运行php-fpm的nginx后面。奇怪的是,要么a)它100%失败,要么b)它没有失败,而不是两者都有一点结果。这使我相信是nginx或php-fpm是罪魁祸首。
openssl_random_pseudo_bytes(16)
不会返回FALSE
。 - Tyler Sebastian