用base 64保存密码是否安全?

时间:2014-12-21 22:21:35

标签: security salt password-hash salt-creation

在Web应用程序中,我正在读取/ dev / urandom中的一些字节,以获取用于散列密码的随机盐。

在散列之前使用盐碱化是否合适?因为base64编码有时会在末尾添加一些=,这可能会导致已知的明文攻击。 但它可能没有问题,因为盐仍然存储在db中,或者我错了吗?

这会对应用程序的安全性产生影响吗?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

在大多数情况下,可能不是。为了解密密码,必须知道你的盐,所以我们可以假设任何攻击者都能获得散列密码和使用的盐。你的盐现在正在防范的是基于彩虹表的攻击并增加了工作量(因为每个明文现在需要被散列n次,而不是一次与n密码进行比较。 / p>

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

答案 2 :(得分:2)

不,它不安全。

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

What's the difference between a Key Derivation Function and a Password-Hash?

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

Do I need base64 encode my salt (for hashing passwords)?

Secure hash and salt for PHP passwords

答案 3 :(得分:1)

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

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