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

13

我试图在我的 php 网站中加密敏感的用户数据,比如个人信息等,然后再将其输入到数据库中。我在互联网上进行了一些研究,并发现以下几点是需要记住的:

  1. 永远不要使用 mcrypt,因为它已经被废弃了。

  2. AES 是基于 Rijndael 算法的,至今仍未被攻破。

  3. AES 也被 NSA 推荐并用于美国政府数据加密,但由于 NSA 在推荐,存在着他们可能轻易地窥探我的用户数据的风险。

  4. Blowfish 也是尚未被攻破的算法,但速度较慢且不太流行。

所以,我决定首先尝试使用 AES-256 cbc 进行加密。但我仍不确定是否应该考虑 Blowfish 作为更好的选择。因此,欢迎任何建议。

而我的主要问题是,如何在 php 中加密数据?我在 php 文档中没有找到一个好的手册来解释这个问题。正确的实现方式是什么?

非常感谢任何帮助!

1个回答

33

AES-256(OpenSSL 实现)

你很幸运。

openssl 扩展提供了一些非常易于使用的 AES-256 方法。你需要执行以下步骤:

  1. 生成一个 256 位加密密钥(需要将其存储在某个地方)
    • $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

这是一个指向"http://phpfiddle.org/lite/code/9epi-j5v2"的超链接。

好的,谢谢!将加密数据直接存储到数据库中,当接收者需要查看时,我只需提供密钥和iv,这样安全吗? - DASH
1
实现完全取决于您。在我看来,最好在用户请求数据时在PHP代码中对其进行身份验证。例如,可以使用登录系统。然后,已经过身份验证的用户可以查看未加密的数据。我绝不建议发布密钥。 - Luke
1
另外,我应该将选项留为0吗?是的,我已经这样做了。我有一个使用bcrypt验证密码的登录系统。我需要知道在我的数据库中存储个人消息等敏感数据是否安全?这会减慢我的性能吗?Blowfish是否可以作为替代方案? - DASH
2
由于加密字符串中存在“:”的可能性不为零,使用explode并不是最好的选择。我建议使用substr。 - Mav
3
只要你不使用 OPENSSL_RAW_DATA,那么 $encrypted 就是一个 base64 字符串。如果在将 $iv 与 ':' 连接之前对其进行 base64_encode() 处理,那么就可以确保安全,因为 base64 不使用 ':'。 - Shardj
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接