如果始终在本地保存和检索加密数据,是否还需要 HMAC

Is HMAC still needed if encrypted data is always saved and retrieved locally

我对 HMAC 的理解是它可以帮助在处理数据之前验证加密数据的完整性,即它可以用来确定发送到解密例程的数据是否以任何方式被修改.

既然如此,如果数据永远不会在生成数据的应用程序之外传输,那么将其纳入加密方案是否有任何优势?我的用例非常简单 - 用户将数据(以明文形式)提交到我编写的用于存储客户详细信息的脚本。然后我的脚本加密这些数据并将其保存到数据库中,然后我的脚本为用户提供了一种方法来检索数据并根据他们提供的记录 ID 对其进行解密。我的用户无法将加密数据直接发送到解密例程,我不需要提供外部 API.

因此,假设应用程序中默认存在信任链是否合理,因为同一应用程序负责写入和检索数据?如果我将 HMAC 添加到该方案中,在这种情况下它是多余的还是无论上下文如何始终实施 HMAC 是最佳实践?我打算使用 Defuse 库,但我想了解 HMAC 对我的项目有何好处。

在此先感谢您的任何建议或意见:)

我的强迫症通常规定实施 HMAC 总是好的做法,如果没有其他原因,从日志中删除警告。

对于您的情况,除了确保纯文本提交的完整性之外,我认为实施 HMAC 没有明确的好处。您的脚本可能会加密数据,但在传递给它的错误数据这种不太可能发生的情况下,它不会有用。

首先,您应该了解存在允许攻击者修改加密数据而不解密的攻击。请参阅 Crypto.SE 上的 Is there an attack that can modify ciphertext while still allowing it to be decrypted? on Security.SE and Malleability attacks against encryption without authentication。如果攻击者获得对加密数据的写入权限——即使没有任何解密密钥——他们也可能造成严重破坏。

你说加密数据是 "never transmitted outside of the application generating it" 但在接下来的两句话中你说你 "save it to the database" 这似乎(对我来说)有点矛盾。信任内存中加密数据的处理是一回事,但信任它在磁盘上的序列化,尤其是如果由另一个程序(例如数据库系统)and/or 在单独的物理机器上(现在或将来,如系统在进化)。

这里的重要问题是:攻击者是否有可能在不访问应用程序和密钥的情况下修改加密数据或将其替换为备用加密数据?如果攻击者是内部人员并以普通用户身份运行程序,那么通常不可能保护您的数据:程序允许攻击者做的任何事情都在 table 上。但是,当非用户(或超出其正常权限的用户)可以对数据进行写访问时,HMAC 是相关的。如果数据库遭到破坏,攻击者可能会修改数据而不受惩罚,甚至无法访问应用程序本身。使用 HMAC 验证严重限制了攻击者有效修改数据的能力,即使他们获得了写访问权。