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

DAS*_*ASH 4 php cryptography aes php-openssl

我想在进入数据库之前加密敏感的用户数据,如我的php网站中的个人消息.我在互联网上研究了一下,我发现了一些要记住的重要事项:

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

  2. AES基于Rijndael算法,至今尚未完整.

  3. AES也被NSA推荐并用于美国政府数据加密,但由于NSA推荐它,他们很可能很容易偷偷摸摸我的用户数据.

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

所以,我决定先用AES-256 cbc试一试.但我仍然不确定我是否不应该认为Blowfish是一个更好的选择.所以欢迎任何建议.

我主要担心的是,如何在php中加密数据?我在php文档中找不到关于这个的好手册.实施它的正确方法是什么?

任何帮助都非常感谢.

Luk*_*uke 18

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 - 小提琴.

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

  • @Mav 只要你不使用 OPENSSL_RAW_DATA 那么 $encrypted 就是一个 base64 字符串,如果你在与 ':' 连接之前使用 base64_encode($iv) 那么你会很安全,因为 base64 不使用 ':' (3认同)
  • 由于“:”出现在加密字符串中的可能性非零,因此使用 expand 不是最佳选择。我建议使用 substr。 (2认同)