【发布时间】:2023-03-12 10:13:01
【问题描述】:
PHP 中的 openssl_* 函数存在一些问题:
由于某种原因,PHP 页面 (http://php.net/manual/en/function.openssl-encrypt.php) 说 $options 参数可以是其中一个 OPENSSL_RAW_DATA OPENSSL_ZERO_PADDING
当我使用 OPENSSL_ZERO_PADDING 加密数据时,它显示空白字段。
$passphrase = md5( 'lolhaha' );
$iv = md5( 'cheese' );
$enc = openssl_encrypt( "Hello World!", "aes-256-cbc", $passphrase, OPENSSL_ZERO_PADDING, $iv );
echo $enc . "{ENC}";
echo ' --------- ';
$dec = openssl_decrypt( $enc, "aes-256-cbc", $passphrase, OPENSSL_ZERO_PADDING, $iv );
echo $dec . "{DEC}";
但是,如果我使用OPENSSL_RAW_DATA,它可以正常工作。现在,当在该字段中使用false 时,它也可以工作,但返回base64 这是因为我使用的是旧版本的PHP,它可能还在使用bool $raw_output? int $option OPENSSL_ZERO_PADDING和bool $raw_output false一样吗?
另外,我收到消息说我的IV 对于我正在使用的密码来说太长了;它显然应该是 16 个字节。根据OpenSSL (https://www.openssl.org/docs/apps/enc.html) $iv 和 $passphrase (key 根据biohazard on PHP (http://php.net/manual/en/function.openssl-encrypt.php)) 应该是十六进制值,是md5适合吗? passphrase/key 可以是多少字节?
Errrr,换句话说,您如何正确使用此加密? //困惑
【问题讨论】:
-
尝试每个 eh 问题问一个问题,CakeSneer。如果 IV 太长,我会尝试原始 MD5 输出。出于某种原因,每个使用 PHP 的人都认为 MD5 是一种从密码生成密钥和 IV 的神奇函数。不是,请改用 PBKDF2 或 bcrypt。
-
官方
OpenSSL页面声明passphrase/key必须是十六进制数字。所以,我想知道md5()是否对此有效?例如substr( md5( 'abc' ), 0, 16 ) -
MD5 产生 16 字节的哈希值。您使用的是 AES-256,因此您需要一个 32 字节的密钥。您可能应该使用 SHA-256 来获取 32 字节的
passphrase字符串;或使用 PBKDF 生成 32 字节的密钥材料。 -
我认为您的意思是带有原始数据(二进制)的 SHA-512。就像一个魅力一样,在 SHA-512(原始数据)之后附加一个字节不会。 :)
-
OPENSSL_ZERO_PADDING 关闭所有填充(你必须自己做填充)。 OPENSSL_RAW_DATA 将原始数据返回给调用者,而不是对其进行 Base64 编码。
标签: php encryption openssl