我需要加密受保护的内部应用程序使用的第三方应用程序的凭据。在ITSec.SE上,我得到了有益的展示,该方案基于内部应用程序的凭据哈希来加密第三方凭据。

我选择AES作为加密算法,但是问题是基于密码的方案不会产生“秘密” IV。因此,IV必须至少对攻击者是已知的(与加密数据一起存储)。用于密码验证的哈希值可以工作,或者我可以生成一个伪随机字节数组,并将其作为新列放入数据库。为了简单起见,我进一步考虑使用常数IV。

这些选择中的任何一个都会对加密的安全性产生什么不利影响?像许多分组密码一样,AES是否依赖不可预测的IV? IV是否存储为未加密的明文是否重要?

#1 楼

不要使用固定的IV。它可能会带来严重的负面影响。对于CBC模式尤其如此。

也就是说,通常需要用明文存储的随机128位IV。攻击者可以知道IV,而不会破坏安全性。

评论


$ \ begingroup $
如果这样做,请记住,CBC模式对IV具有超严格的要求。最佳做法是使用加密安全的伪随机数生成器生成它。
$ \ endgroup $
–斯蒂芬·托瑟(Stephen Touset)
2012年10月18日在17:04

$ \ begingroup $
Keith,我建议您使用System.Security.Cryptography.SymmetricAlgorithm.GenerateIV()而不是尝试生成自己的字节数组并将其自己加载到IV中。首先,Microsoft的实现已可用并经过了预先测试,因此您应该没有什么商业理由重新发明该工具。另一个是,如果有人在下个月发现涉及IV的弱点,则Microsoft将分发补丁程序,而您不必自己处理维护后果。
$ \ endgroup $
–约翰·迪特斯
2012-10-18 21:55

$ \ begingroup $
...除了在我的情况下,我使用的是PBKDF,并且SymmetricAlgorithm.CreateEncryptor()没有只接受密钥的重载。
$ \ endgroup $
– KeithS
2012年12月13日在15:59

$ \ begingroup $
@KeithS我知道此注释会在数年后发布,但是对于其他任何人来说,不带任何参数的CreateEncryptor都使用Key和IV,它们是拥有的SymmetricAlgorithm的属性。
$ \ endgroup $
–卢克公园
16年1月7日在2:07

$ \ begingroup $
@mikeazo,“尤其适用于CBC模式”吗? “特别”在这里是什么意思,那么对于哪个模式不正确?
$ \ endgroup $
–起搏器
16 Dec 26'3:15

#2 楼

初始化向量永远不需要是秘密的。如果需要保密,则将其称为“密钥”,而不是“向量”。

通常,初始化向量要求仅取决于操作模式,而不取决于选择的方式。分组密码。然而,操作模式的参数,例如IV大小,可以取决于所使用的分组密码的块大小。对于CBC模式,IV始终与块大小相同,对于AES,它的大小为16个字节。

对于CBC模式,当仅将相同密钥用于以下操作时,可以使用固定的初始化向量一条消息。请注意,这也意味着您不应将IV重复用于同一消息的多个版本。如果您的密钥是根据用户使用哈希的登录凭据确定性地计算出来的,那么它将无法正常工作。但是,您可以使用变化的盐和密码哈希,例如PBKDF2或Argon2。然后,唯一的盐和唯一的密钥将充当初始化向量的安全性角色。

当攻击者可以选择要加密的消息然后观察密文时,变化但可预测的初始化向量是不好的。可能会观察IV /明文组合是否会导致对块密码的相同输入,从而导致相同的密文。因此,使用可预测的IV可能会泄漏有关具有特定值的先前纯文本的信息。攻击者选择的初始化向量当然也很糟糕,即使她无法选择消息也是如此。

通常在密文旁边存储一个密码安全的(伪)随机初始化向量。所有操作模式均安全。


请注意,您通常还需要根据数据计算MAC,以确保未经检测即无法更改。如果您不这样做,那么攻击者可以修改密文,并在尝试解密时观察反应。这可能使攻击者可以执行填充或其他纯文本预言攻击并检索纯文本。如果将IV存储在密文旁边,则还应将IV包括在MAC的计算中。

评论


$ \ begingroup $
那么IV和盐实际上起到相似的作用吗?意味着它们可以互换并且永远不会同时需要它们吗?
$ \ endgroup $
– DiidierA。
2014年10月10日14:28
$ \ begingroup $
它们都实现相同的目的,但是通常在不同的上下文中使用。 IV用于加密算法(如分组密码的操作模式),而盐则用于密钥派生或密码散列等。但是单词用法略有不同,并且边界没有明确定义。
$ \ endgroup $
–PaŭloEbermann
2014年10月10日22:03

$ \ begingroup $
@PaŭloEbermann,这是一个很好的答案。自发布以来,我知道它的某个时间,但是您是否可以提供任何参考链接以及其他详细信息?会非常有用
$ \ endgroup $
–异氰酸烯丙酯
16年2月2日在20:20

$ \ begingroup $
@juwiley我首先建议Wikipedia的《操作模式》一文,它有更多链接。
$ \ endgroup $
–PaŭloEbermann
16年2月2日在20:27

$ \ begingroup $
Paulo,您好你好吗?我已经实质性地重写了您的文字。我希望您喜欢它,否则回滚到组织。版!
$ \ endgroup $
–马腾·博德威斯♦
18年11月16日在13:41

#3 楼

如果您使用固定的IV,则实际上,您发送的每条消息的第一块都处于ECB模式。由于许多消息的纯文本以相同的方式开始并不罕见,例如:


发件人:Hiram K. Sluggenheimer


那么,如果有多个消息使用相同的密钥,则可能是一个弱点。

简而言之,请避免使用固定的IV,而应使用加在密文前面的加密随机IV。