php - 如何使用 OpenSSL 在 PHP 中使用 AES-256 CBC 加密明文?

标签 php cryptography aes php-openssl

我试图在进入数据库之前加密我的 php 驱动网站中的个人消息等敏感用户数据。我在互联网上进行了一些研究,发现了一些需要记住的重要事项:

  1. 永远不要使用 mcrypt,它是废弃软件。

  2. AES基于Rijndael算法,至今未被破解。

  3. AES 也被美国国家安全局推荐并用于美国政府的数据加密,但由于美国国家安全局推荐它,他们有可能轻易窃取我的用户数据。

  4. Blowfish 也一直没有中断,但速度慢且不太受欢迎。

因此,我决定先尝试使用 AES-256 cbc。但我仍然不确定我是否不应该将 Blowfish 视为更好的选择。因此,欢迎提出任何建议。

我最关心的是,如何在 php 中加密数据?我在 php 文档中找不到关于此的好手册。正确的实现方式是什么?

非常感谢任何帮助。

最佳答案

AES-256(OpenSSL 实现)

你很幸运。

openssl 扩展有一些非常容易使用的 AES-256 方法。您需要采取的步骤基本上是...

  1. 生成一个 256 位加密 key (这需要存储在某处)
    • $encryption_key = openssl_random_pseudo_bytes(32);
  2. 生成一个“初始化向量”(这也需要存储用于解密,但我们可以将其附加到加密数据中)
    • $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
  3. 使用 openssl_encrypt() 加密数据
    • openssl_encrypt($data,'aes-256-cbc',$encryptionKey,$options,$initializationVector)
    • 对于默认选项,$options 可以设置为 0 或更改为 OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
  4. 将初始化向量附加到加密数据
    • $encrypted = $encrypted . ':'。 $iv;
  5. 检索加密数据和初始化向量。
    • explode(':' , $encrypted);
  6. 使用openssl_decrypt() 解密数据
    • openssl_decrypt($encryptedData,'aes-256-cbc',$encryptionKey,$options,$initializationVector)

启用openssl

openssl_functions() 默认情况下不可用,您可以通过取消注释行在 php.ini 文件中启用此扩展。 ;extension=php_openssl.dll 通过删除前导 ;

PHP - fiddle 。

http://phpfiddle.org/lite/code/9epi-j5v2

关于php - 如何使用 OpenSSL 在 PHP 中使用 AES-256 CBC 加密明文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871579/

相关文章:

java - 加密数据随机存取 AES GCM模式

python - 使用 python 和 nodejs 加密和解密

c# - 如何从 AES-GCM 获取认证标签

javascript - 页面正在刷新,但不会进行查询 - Ajax、PHP

php - 动态表单单选按钮搞砸了 foreach 循环 mysql 插入

java - 如何验证GMAC?

java - 枚举 Java 中可用的所有椭圆曲线名称的方法?

javascript - 从数据库加载 3d 模型并在 Three.js 中使用它

php laravel 数据库数据插入错误

c# - 如何使用 FromBase64String 创建长度为 16 的 byte[]