Apache/PHP正在为openssl()安装密码-在openssl_get_cipher_methods中丢失

slhcrj9b  于 2022-12-02  发布在  PHP
关注(0)|答案(2)|浏览(165)

我刚刚从一个非常旧的服务器迁移到PHP 8.1。现在我遇到了openssl_encrypt返回false或空字符串的问题,因为它不知道BF-ECB引擎以前在旧服务器上工作过什么。
命令openssl_get_cipher_methods验证了这一点,没有可用的BF-ECB。在旧服务器上是OpenSSL1.1在新的3.0上。
任何人都可以帮助我安装或告诉我的管理员需要什么?

8hhllhi2

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

whhtz7ly

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]部分并在其后面添加以下新部分:

[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()返回的密码列表中。

相关问题