1

In a web application I am reading some bytes from /dev/urandom to get a random salt for hashing the passwords.

Is it good to base64 the salt before hashing? Because base64 encoding sometimes appends some = at the end, which could then result in a known plaintext attack. But it may be no problem, because the salt is nevertheless stored in db, or am I wrong?

Does this have an effect on the security of the application?

4

4 回答 4

2

在大多数情况下,可能不是。必须知道您的盐才能解密密码,因此我们可以假设任何攻击者都能够获得散列密码和使用的盐。你的 salt 现在要防止的只是基于彩虹表的攻击和增加工作量(因为现在每个明文都需要哈希n时间而不是一次来与n密码进行比较)。

只要你的盐的长度合理,你就可以了。

于 2014-12-21T22:46:21.903 回答
2

这取决于所使用的哈希算法,哪个字母表被接受为盐。例如,BCrypt 将接受以下字符,这与 base64 编码文本几乎但不完全相同: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.

已知的纯文本攻击在这里没有问题,因为我们不加密任何东西,尤其是盐。

于 2014-12-21T22:39:45.237 回答
2

不,它不安全。

您不应该对用户密码使用任何散列函数。相反,您应该使用基于密码的密钥派生函数,例如 PBKDF2 或 scrypt,并具有适当的迭代次数,以减慢散列速度,从而降低暴力攻击的风险。

密钥派生函数和密码哈希有什么区别?

如果您在 Web 应用程序中使用 PHP:

我是否需要对我的盐进行 base64 编码(用于散列密码)?

PHP 密码的安全哈希和盐

于 2014-12-21T22:54:30.117 回答
1

盐的目的是确保每个密码的存储方式不同。也就是说,如果两个人使用相同的密码,则两个密码的存储方式不同。如果攻击者设法提取密码表数据,这可以防止彩虹和哈希表攻击。

虽然没有理由对它进行 Base64 处理 - 哈希应该是字节序列而不是 ASCII 文本 - 这不应该影响您的哈希密码的安全性。是的,将使用有限的字节序列(仅代表有效 ASCII 字符的字节序列),但是您的哈希值会更长,并且它代表相同范围的可能值。

于 2014-12-24T11:26:36.187 回答