我有两台设备,我想在它们之间建立一个安全的通信通道。唯一的共享密钥是(7到20个字符的ASCII)密码。如果我将PBKDF2 (来自RFC2898)与共同的盐、迭代和口令一起使用来在两端生成AES256-CBC密钥和IV,我想我可以在一个步骤中验证用户并提供加密通道。这是真的吗,还是有什么原因让我看到人们只使用PBKDF2来验证密码?
我的推理是,两端都需要知道密码才能生成相同的密钥和IV。因此,如果设备B可以解密来自设备A的数据,则它们都证明了自己拥有相同的密码。
发布于 2010-12-01 09:27:17
PBKDF2是从共享密钥生成公共密钥的好方法(您不应该以这种方式生成IV - IV应该是随机的,并与密文一起发送)。
但是,CBC不是一种身份验证密码模式。这是因为攻击者可以获取加密消息并对其进行可预测的修改,而不需要能够读取消息或知道密钥。在过去,这样的攻击已经破坏了现实世界的系统。
您可以使用身份验证密码模式,如伽罗瓦计数器模式(GCM),而不是CBC。
另一种方法是Encrypt-Then-MAC。使用带有两个不同盐的PBKDF2来生成两个不同的密钥-首先使用CBC使用第一个密钥加密数据,然后使用第二个密钥在密文上计算HMAC。
您还需要使用单次使用随机数来防止重放攻击。
发布于 2010-12-01 08:50:12
通常,您不能使用密码对消息进行身份验证,因为消息可以是任何内容。但是,如果消息符合某种指定的格式,我认为可以合理地假设密文一定是使用共享密钥生成的-更复杂格式的更长消息提供了更好的保证。例如,分组密码中的填充可以用作弱认证。
为了获得更好的安全性,请使用共享密钥计算MAC并将其与密文一起发送。
虽然PBKDF2可用于生成IV,但它只能对单个消息执行此操作。在大多数情况下,最好选择一个随机的IV并将其与密文一起发送。
发布于 2010-12-01 08:49:11
PBKDF2不“验证密码”。它从密码生成密钥。
要验证密码,通常需要使用密钥对其进行加密。密钥由原始密码通过PBKDF2生成。则保存密文。
当您想要检查用户输入的文本是否与密码匹配时,使用PBKDF2从密码候选生成密钥,然后尝试解密保存的密文。如果解密成功了,那你就有匹配的了。
不过,通常情况下,您不会将基于密码的密钥用作session key。
因此,您通常不会使用基于密码的密钥来保护安全通道。
https://stackoverflow.com/questions/4320222
复制相似问题