IV 通常是一个随机数,用于保证加密文本的唯一性。
为了解释为什么需要它,让我们假设我们有一个用“secret”密钥加密的人名数据库,没有使用 IV。
1 John dsfa9p8y098hasdf
2 Paul po43pokdfgpo3k4y
3 John dsfa9p8y098hasdf
如果约翰 1 知道他的密文 (dsfa9p8y098hasdf) 并且可以访问其他密文,他可以轻松找到其他名为约翰的人。
现在实际上,需要 IV 的加密模式将始终使用 IV。如果您不指定 IV,它会自动设置为一堆空字节。想象一下第一个例子,但 IV 为常数 (00000000)。
1 John dsfa9p8y098hasdf 00000000
2 Paul po43pokdfgpo3k4y 00000000
3 John dsfa9p8y098hasdf 00000000
为了防止重复的密文,我们可以使用相同的“秘密”密钥和随机 IV 来加密名称:
1 John sdf875n90mh28458 86714561
2 Paul fg9087n5b60987nf 13541814
3 John gjhn0m89456vnler 44189122
正如您所看到的,两个“John”密文现在不同了。每个 IV 都是独一无二的,并且会影响加密过程,从而使最终结果也独一无二。 John 1 现在不知道用户 3 的名字是什么。
当然,解密需要使用与加密文本相同的 IV,这就是为什么它必须与加密数据一起存储的原因。对于解密来说,如果没有密钥,IV 是无用的,因此与加密文本一起传输或存储它是无关紧要的。
这是一个过于简单的例子,但事实是,不使用 IV 会产生严重的安全后果,这就是 IV 存在的首要原因。毫无疑问,无数的无 IV 加密实现已被利用。
随着我的安全知识的进步,我了解到各种分组密码模式和串联技术(与下面描述的串联方法没有特别相关)有一些更复杂的利用,可以利用 IV 来获取密钥。著名的利用例子RC4 https://en.wikipedia.org/wiki/RC4数据流来确定密钥并解密旧技术的 Wi-Fi 流量,例如WEP https://en.wikipedia.org/wiki/Wired_Equivalent_Privacy and WPA https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access:
- 密钥调度算法的弱点
RC4 https://www.cs.cornell.edu/people/egs/615/rc4_ksaproc.pdf
- 对固定 RC4 的实际攻击
无线加密协议模式 https://iacr.org/archive/asiacrypt2005/390/390.pdf
现在,您的代码似乎正在设置 IV (1234567812345678),但在解密时没有使用它。那是肯定会失败的。
您可能还想利用 PHP 的一些 IV 生成函数。我认为这应该对你有用:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, 0, $iv);
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash, 0, $iv);
对于存储/传输,一种选择是简单地连接 IV 和密文,如下所示:
$data = $iv.$encryptedMessage;
然后在检索时,拉出 IV 进行解密:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = substr($data, 0, $iv_size);
$decryptedMessage = openssl_decrypt(substr($data, $iv_size), $encryptionMethod, $secretHash, 0, $iv);
例如,如果您将 IV 存储在数据库中,您还可以将 IV 存储在相邻列中以简化提取过程。
有关更多信息,请查看 PHP 的 Mcrypt 库。它功能非常齐全,并且有大量示例,其中许多示例可以帮助您实现 openssh 加密。http://php.net/manual/en/function.mcrypt-encrypt.php http://php.net/manual/en/function.mcrypt-encrypt.php
强制性安全免责声明:我的话以最简单的方式描述了最简单的概念。就我的知识广度和深度而言,我绝对是一个新手。即使是最优秀的安全研究人员和专家也会引入加密漏洞每时每刻。即便如此,你自己写的越少,你的用户、客户、家人和朋友就会越好。没有冒犯的意思!虽然学习加密理论很有趣,很有趣,甚至很实用,尤其是在像 PHP 这样易于访问的计算机科学中应用,但保持最新的最佳实践并使用最新的可信库将为 99.9999999 提供最安全的系统% 我们。没有什么是完美的,但最好是站在巨人的肩膀上。正如一位智者可能会说的:“你越learn你越意识到自己是多么的渺小know."