使用php openssl_encrypt的正确方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用php openssl_encrypt的正确方法相关的知识,希望对你有一定的参考价值。
我在项目上使用加密技术,我需要一些关于如何使用openssl_encrypt
和openssl_decrypt
的帮助,我只是想知道最基本和正确的方法。这是我到目前为止所得到的:
// To encrypt a string
$dataToEncrypt = 'Hello World';
$cypherMethod = 'AES-256-CBC';
$key = random_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cypherMethod));
$encryptedData = openssl_encrypt($dataToEncrypt, $cypherMethod, $key, $options=0, $iv);
然后我在解密$cypherMethod
时存储$key
,$iv
和$encryptedData
。 (我们不详细说明如何存储值,谢谢!)
// To decrypt an encrypted string
$decryptedData = openssl_decrypt($encryptedData, $cypherMethod, $key, $options=0, $iv);
首先,上面的示例代码是如何使用php openssl_encrypt
的正确示例?
第二,我的方法是生成$key
和$iv
正确和安全吗?因为我继续阅读,密钥应该是加密安全的。
最后,是不是32-byte
所需的AES-256-CBC
值?如果是,那么为什么openssl_cipher_iv_length()
只返回int(16)
作为长度?不应该是int(32)
?
首先,上面的示例代码是如何使用php openssl_encrypt的正确示例?
您对该功能的使用看起来是正确的,但您可能需要考虑除CBC之外的其他操作模式。 CBC很难做到正确,因为在这种模式下加密数据已经存在已知的攻击,例如臭名昭着的CBC bit-flipping attack,它允许攻击者通过修改密文对明文进行有意义的更改。如果可能的话,我会使用像GCM这样经过身份验证的加密模式(看起来像it's supported in PHP 7.1+ (Example #1))。
如果您使用CBC模式,请查看Example #2 in the docs。注意,在加密之后,通过密文计算MAC(消息认证码)并存储。在解密密文之前应该重新计算该MAC,如果它与存储的MAC不匹配,则密文已被修改并且无效。
第二,我的方法是生成$ key和$ iv是否正确且安全?因为我继续阅读,密钥应该是加密安全的。
需要使用加密安全随机数生成器生成密钥。幸运的是,大多数操作系统通过/dev/urandom
提供一个开箱即用的系统。 This answer很好地解释了如何从PHP中读取/dev/urandom
。 openssl_random_pseudo_bytes
也应该是加密安全的,但有times when this is not the case。
初始化向量(IV)需要是随机的,不应该使用相同的密钥重复使用。
最后,AES-256-CBC不是32字节值?如果是,那么为什么openssl_cipher_iv_length()只返回int(16)作为长度?不应该是int(32)吗?
AES是一种块密码,无论密钥大小如何,都可以在128位(16字节)块上运行。
以上是关于使用php openssl_encrypt的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
php7使用openssl_encrypt函数进行AES加密
在 PHP 中将 mcrypt_encrypt 转换为 openssl_encrypt
使用 Crypto 将 PHP openssl_encrypt 与 md5 转换为 NodeJS