如何使用CBC和HMac?加密PHP

Posted

技术标签:

【中文标题】如何使用CBC和HMac?加密PHP【英文标题】:How to use CBC and HMac? Mcrypt PHP 【发布时间】:2012-09-08 20:52:04 【问题描述】:

你如何使用CBC和HMAC?

我在互联网上找不到足够的信息。

你如何获得静脉注射?当您稍后需要解密时,您怎么知道它是什么? (将它放入数据库不会破坏目的吗?)

什么是 HMAC,它是否受到黑客攻击的保护?

加密的文本保留在数据库中。如果有人入侵了数据库,他们可能也可以访问文件管理器,除非他们找到了进行 SQL 注入的方法。脚本如何知道黑客不知道的 IV 和密钥?

加密多段文本时最好使用什么方法,只有编写它的用户才能在网站内看到? (用户始终将其视为纯文本。)

我现在使用 ECB(该网站尚未发布测试版)但我听说 CBC 更安全。

【问题讨论】:

【参考方案1】:

IV 的主要目的是使每种加密方式都不同。这不是秘密。为每个加密创建一个随机 IV 并将其存储为密文的前缀是标准的。

HMAC 是一个 MAC,它确保只有知道密钥的人创建的消息才会被接受为有效消息。重要的是在加密后应用 MAC 并包含 IV。即HMAC(IV+Encrypt(...)),因此在解密之前对其进行验证。这样可以避免某些攻击,例如填充预言。

还值得考虑使用经过身份验证的加密模式,例如 AES-GCM,它以安全的方式结合身份验证和加密。只要确保在这种情况下你永远不会重复使用 IV。


在哪里存储密钥是一个难题,并且非常依赖于应用程序。正如您所注意到的,将密钥存储在与数据库相同的系统上并不会带来太多好处。

有时,使用带有盐的慢速 KDF(例如 PBKDF2)从用户密码中获取密钥是个好主意。有时您可以将其存储在客户端上。有时您可以将其存储在攻击面较小的不同服务器上。

要确定将其存储在何处,您需要明确的要求和威胁模型。

【讨论】:

以上是关于如何使用CBC和HMac?加密PHP的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenSSL/C++ 和 PHP/Mcrypt 的 AES-128-CBC 加密:仅解密第一个块

Golang:如何使用 DES 和 CBC 加密 5 个字符长的纯文本?

使用 Perl CBC 加密并使用 PHP mcrypt 解密

如何使用Javascript中的AES CBC零填充进行加密并使用Java进行解密

如何安全地为 AES CBC 加密生成 IV?

怎样查看snmp v3加密方式