我可以使用PBKDF2生成AES256密钥来加密和隐式验证吗?

时间:2010-12-01 00:41:22

标签: security encryption cryptography

我有两台设备,我想在它们之间建立一个安全的通信通道。唯一的共享秘密是(7到20个字符的ASCII)密码。如果我使用PBKDF2(来自RFC 2898)使用公共盐,迭代和密码来生成双方的AES256-CBC密钥和IV,我想我可以一步验证用户并提供加密通道。这是真的吗,还是有一些原因我只看到人们使用PBKDF2来验证密码?

我的理由是双方都需要知道密码才能生成相同的密钥和IV。因此,如果设备B可以解密来自设备A的数据,他们都证明他们具有相同的密码短语。

4 个答案:

答案 0 :(得分:4)

PBKDF2是从共享密钥生成公共密钥的好方法(不应该以这种方式生成IV - IV应该是随机的,并且与密文一起发送)。

但是,CBC不是一种身份验证密码模式。这是因为攻击者可以获取加密消息并对其进行可预测的修改,而无需读取消息或知道密钥。这种攻击过去打破了现实世界的系统。

您可以使用验证密码模式,例如Galois Counter Mode(GCM)而不是CBC。

另一种选择是Encrypt-Then-MAC。使用两种不同盐的PBKDF2生成两个不同的密钥 - 首先使用带有第一个密钥的CBC加密数据,然后使用第二个密钥在密文上计算HMAC。

您还需要使用一次性使用nonce来防止重放攻击。

答案 1 :(得分:2)

通常,您无法使用密码对邮件进行身份验证,因为邮件可能是任何内容。但是,如果消息符合某些指定的格式,我认为假设密文必须是使用共享密钥生成的 - 使用更复杂格式的更长消息可以提供更好的保证是合理的。例如,块密码中的填充可以用作弱认证。

为了更好的安全性,使用共享密钥计算MAC并将其与密文一起发送。

虽然PBKDF2可用于产生IV,但它只能用于单个消息。在大多数情况下,最好选择随机IV并使用密文发送它。

答案 2 :(得分:1)

PBKDF2不“验证密码”。它从密码生成密钥。

要验证密码,通常您会使用密钥加密。密钥由原始密码通过PBKDF2生成。然后保存密码文本。

如果要检查用户输入的文本是否与密码匹配,请使用PBKDF2从候选密码生成密钥,然后尝试解密保存的密码文本。如果解密有效,那么你就有了匹配。

但是,通常情况下,您不会将基于密码的密钥用作session key

所以,不,您通常不会使用基于密码的密钥保护安全通道。

答案 3 :(得分:-2)

caf的回答很好。我只想补充一点,你正在尝试实施加密,甚至是训练有素的专家,通常都是bad idea。使用最高级别的库可以非常安全。