【问题标题】:Proper openssl_encrypt and openssl_decrypt正确的 openssl_encrypt 和 openssl_decrypt
【发布时间】: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_outputint $option OPENSSL_ZERO_PADDINGbool $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


【解决方案1】:

Errrr,换句话说,您如何正确使用此加密? //困惑

如果您正在寻找安全性,请改用defuse/php-encryption

如果您想学习,请在内部see how defuse/php-encryption encrypts messages

通常,OpenSSL 扩展为您提供too many options。在专家监督下使用是安全的(与 mcrypt 不同),但它仍然不是很好的开发者体验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多