我刚刚从一个非常旧的服务器迁移到PHP 8.1。现在我遇到了openssl_encrypt返回false或空字符串的问题,因为它不知道BF-ECB引擎以前在旧服务器上工作过什么。命令openssl_get_cipher_methods验证了这一点,没有可用的BF-ECB。在旧服务器上是OpenSSL1.1在新的3.0上。任何人都可以帮助我安装或告诉我的管理员需要什么?
8hhllhi21#
调用openssl_get_cipher_methods()时得到了bf-ecb,请尝试执行以下操作
<?php openssl_get_cipher_methods()[61]; // 'bf-ecb' ?>
我做了以下工作使它工作:
<?php $cipher = openssl_get_cipher_methods()[61]; $ivlen = openssl_cipher_iv_length($cipher); // iv_length = 0; $plaintext = "message to be encrypted"; $key = openssl_random_pseudo_bytes(4); if (in_array($cipher, openssl_get_cipher_methods())) { $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, "", $tag); // note that I've passed $iv = "" in order to get the &$tag; echo "$ciphertext" . PHP_EOL; echo bin2hex($ciphertext) . PHP_EOL; $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, "", $tag); // $iv = "" again; echo $original_plaintext."\n"; } ?>
我在openssl_encrypt()的文档基础上构建了它; https://www.php.net/manual/pt_BR/function.openssl-encrypt.php
whhtz7ly2#
请参阅Matt Caswell的answer,了解为什么会发生这种情况以及如何修复它。我在升级到PHP 8.1后遇到了同样的问题,发现默认情况下bf-cbc在OpenSSL 3.0中不可用。在OpenSSL 3.0中,Blowfish成为了一个传统的密码,并且默认情况下不加载。当PHP试图使用该密码进行加密时,它会失败,因为它没有被加载和使用。要在PHP中实现这一点,需要更新OpenSSL配置文件以启用传统密码。在phpinfo()中查找“Openssl default config”的值。该位置因平台而异。在Debian系统中,它是/usr/lib/ssl/openssl.cnf。如果该设置没有值,您需要找到它或创建一个新的openssl配置文件并在php.ini中设置它。
bf-cbc
phpinfo()
/usr/lib/ssl/openssl.cnf
接下来,在文本编辑器中打开openssl.cnf,找到设置部分[providers_sect]。在default = default_sect行下面,添加一行legacy = legacy_sect。最后,找到[default_sect]部分并在其后面添加以下新部分:
openssl.cnf
[providers_sect]
default = default_sect
legacy = legacy_sect
[default_sect]
[legacy_sect] activate = 1
删除注解后,配置文件的一部分应类似于:
[openssl_init] providers = provider_sect ssl_conf = ssl_sect # List of providers to load [provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1
更新openssl配置文件以加载遗留提供程序后,Blowfish密码现在应该可以工作了,并出现在openssl_get_cipher_methods()返回的密码列表中。
openssl_get_cipher_methods()
2条答案
按热度按时间8hhllhi21#
调用openssl_get_cipher_methods()时得到了bf-ecb,请尝试执行以下操作
我做了以下工作使它工作:
我在openssl_encrypt()的文档基础上构建了它; https://www.php.net/manual/pt_BR/function.openssl-encrypt.php
whhtz7ly2#
请参阅Matt Caswell的answer,了解为什么会发生这种情况以及如何修复它。我在升级到PHP 8.1后遇到了同样的问题,发现默认情况下
bf-cbc
在OpenSSL 3.0中不可用。在OpenSSL 3.0中,Blowfish成为了一个传统的密码,并且默认情况下不加载。当PHP试图使用该密码进行加密时,它会失败,因为它没有被加载和使用。
要在PHP中实现这一点,需要更新OpenSSL配置文件以启用传统密码。
在
phpinfo()
中查找“Openssl default config”的值。该位置因平台而异。在Debian系统中,它是/usr/lib/ssl/openssl.cnf
。如果该设置没有值,您需要找到它或创建一个新的openssl配置文件并在php.ini中设置它。接下来,在文本编辑器中打开
openssl.cnf
,找到设置部分[providers_sect]
。在default = default_sect
行下面,添加一行legacy = legacy_sect
。最后,找到
[default_sect]
部分并在其后面添加以下新部分:删除注解后,配置文件的一部分应类似于:
更新openssl配置文件以加载遗留提供程序后,Blowfish密码现在应该可以工作了,并出现在
openssl_get_cipher_methods()
返回的密码列表中。