Security 我可以使用PBKDF2生成AES256密钥进行加密和隐式身份验证吗?

Security 我可以使用PBKDF2生成AES256密钥进行加密和隐式身份验证吗?,security,encryption,cryptography,Security,Encryption,Cryptography,我有2台设备,我想在它们之间建立一个安全的通信通道。唯一的共享秘密是7到20个字符的ASCII密码。如果我使用RFC2898中的PBKDF2和一个公共的salt、迭代和密码短语来生成AES256-CBC密钥和两侧的IV,我认为我可以在一个步骤中对用户进行身份验证并提供加密通道。这是真的吗?还是我只看到人们使用PBKDF2来验证密码的原因 我的推理是,双方都需要知道密码短语才能生成相同的密钥和IV。因此,如果设备B可以从设备A解密数据,他们都证明了他们拥有相同的密码短语。PBKDF2不会验证密码。

我有2台设备,我想在它们之间建立一个安全的通信通道。唯一的共享秘密是7到20个字符的ASCII密码。如果我使用RFC2898中的PBKDF2和一个公共的salt、迭代和密码短语来生成AES256-CBC密钥和两侧的IV,我认为我可以在一个步骤中对用户进行身份验证并提供加密通道。这是真的吗?还是我只看到人们使用PBKDF2来验证密码的原因


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

PBKDF2不会验证密码。它根据密码生成密钥

要验证密码,通常需要使用密钥对其进行加密。密钥由原始密码通过PBKDF2生成。然后保存加密文本

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

不过,通常情况下,您不会将基于密码的密钥用作密码


因此,不,您通常不会使用基于密码的密钥保护安全通道

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

为了更好的安全性,使用共享秘密计算MAC并用密文发送


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

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

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

您可以使用身份验证密码模式,如Galois计数器模式GCM而不是CBC

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


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

caf的答案很好。我只想补充一点,您正在尝试实现加密,即使对于训练有素的专家来说,这通常也是一种挑战。使用最高级别的库非常安全。

我将加密一个基于文本的协议,这样我就能知道消息已正确解密。谢谢你的提示!你应该把它作为评论添加到caf的答案中