4

我正在使用 PKCS#5 标准使用随机且唯一的盐和输入的用户密码生成密钥。将此密钥视为“加密”密钥。

“加密”密钥用于加密随机 AES 密钥。每个用户都有一个与其配置文件关联的 AES 密钥。

因此,用户的个人资料将包含以下信息:

--> 用于身份验证的密码哈希。

--> PKCS#5 算法中使用的盐。(从 PKCS#5 V2.0 文档中,我们知道此信息不需要保护)。

--> 随机生成的加密 AES 密钥,并使用由 PKCS#5 算法生成的“加密”密钥以及盐和用户密码进行加密

我在问自己同时拥有密码的哈希、盐和加密的 AES 密钥是否危险。我有 99.9% 的把握这不是问题,但它能否促进拥有所有这些细节的攻击者的工作?

4

1 回答 1

3

密码哈希也需要使用盐,否则可能会发生字典攻击,并且碰巧选择相同密码的两个用户将在数据库中存储相同的哈希密码。

我建议这样做:只需使用 PKCS#5 两次;一次生成散列密码(您以明文形式存储),一次生成加密密钥(您不生成)。

确保盐是大的、随机的和独立的,这样密码哈希和加密密钥之间就不会存在可检测的关系。毕竟,这就是盐的用途。

[更新,详细说明一下]

选择两种盐 s1 和 s2。确保每个都是至少 64 位、随机且独立的。

使用密码 + s1 作为空字符串上 PKCS#5 HMAC 的输入。这是“散列密码”。

使用密码 + s2 作为 PKCS#5 加密方案的输入来加密实际数据。

将散列密码、s1 和 s2 以明文形式存储在数据库中。完毕。

于 2011-05-30T23:36:35.647 回答