我有两台设备,我想在它们之间建立一个安全的通信通道。唯一的共享秘密是(7到20个字符的ASCII)密码。如果我使用PBKDF2(来自RFC 2898)使用公共盐,迭代和密码来生成双方的AES256-CBC密钥和IV,我想我可以一步验证用户并提供加密通道。这是真的吗,还是有一些原因我只看到人们使用PBKDF2来验证密码?
我的理由是双方都需要知道密码才能生成相同的密钥和IV。因此,如果设备B可以解密来自设备A的数据,他们都证明他们具有相同的密码短语。
答案 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)