【问题标题】:Is salting passwords with base 64 secure?使用 base 64 加盐密码是否安全?
【发布时间】:2014-12-21 22:21:35
【问题描述】:

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

在散列之前对盐进行base64好吗?因为 base64 编码有时会在末尾附加一些 =,这可能会导致已知的明文攻击。 但这可能没问题,因为盐仍然存储在db中,还是我错了?

这对应用程序的安全性有影响吗?

【问题讨论】:

  • 为什么需要base64呢?
  • 真的不知道我只是这样做了,在写这个问题时我意识到这可能是毫无意义的。 :) 但问题是一样的:它不安全吗?
  • 也许可以在Information Security 询问。
  • 末尾的= 是填充,表示输入不是四个字节的倍数。

标签: security salt password-hash salt-creation


【解决方案1】:

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

只要你的盐长度合理,你就可能没问题。

【讨论】:

  • 最小长度大约是多少?我正在读取 32 个字节。
  • 您无需解密密码,因为它从未被加密。散列是不可逆的,不要将其与加密混淆。
  • 我知道,我指的是盐的长度。
【解决方案2】:

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

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

【讨论】:

  • 我想我使用的是 sha512。
  • Sha512 接受所有类型的盐,甚至是二进制字符串。正如其他人已经提到的那样,SHA512 不适合散列密码,因为它太快了,应该使用像 BCrypt 或 PBKDF2 这样的算法,但要考虑成本因素。
【解决方案3】:

不,这不安全。

您不应该对用户密码使用任何散列函数。相反,您应该使用基于密码的密钥派生函数,例如 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

【讨论】:

  • 很多时候人们不知道加密和散列之间的区别,所以告诉他们不要对密码使用散列可能会造成混淆。 PBKDF2通常被称为哈希算法,内部它毕竟使用SHA-*。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2013-08-23
    • 2016-09-27
    • 2016-07-28
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多