代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

我必须把盐和杂碎放在同一列吗?

  •  2
  • Roger Lipscombe  · 技术社区  · 14 年前

    所以,我对使用 per-user salt 散列我用户的密码。不过,有一条建议是 accepted answer

    不要用单独的柱子来盛盐。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Gerald Davis    14 年前

    如果你打算随机存储每个用户的盐,这并不重要。 将salt+hash存储在一列中,或将salt和hash存储在两列中。 就我个人而言,我会将它存储为一个列,因为您不太可能只检索salt或hash。 另外,如果您更新salt,那么hash也需要更新,在更新hash时,您也可以更新salt。从密码学的观点来看,两种存储方法都同样有效。

    衍生盐

    以username为例,将它传递给PBKDF2的1000多个迭代(实际上选择一个唯一且不寻常的迭代次数更好——比如2137)。这将需要攻击者访问 不仅是数据库,还有你的源代码 来打败这个系统。

    现在,如果攻击者可以完全访问密码表和源代码,则无法获得安全性;但是,如果攻击者只能访问数据库(有限的入侵),则您已停止攻击或至少使攻击变得更加困难。

        2
  •  1
  •   Ben Jackson    14 年前

    我认为第一个答案的第二部分(关于“动态salt”的部分)给出了一个与您期望的一样的答案:生成一个随机的、每个用户的salt并用散列密码存储它。这正是UNIX passwd(以及后来的shadow)文件几十年来所做的事情。

    http://en.wikipedia.org/wiki/CRAM-MD5 这就避免了用户通过网络发送他们的密码,让他们用服务器指定的“salt”散列它。

        3
  •  1
  •   dajames    14 年前

    安全的答案是,这无关紧要。

    数据库的答案是salt和hash是不同的数量,因此理想情况下应该将它们存储在不同的列中。如果你这样做,那么数据库可以说是 .

    然而,这种情况并不少见 提高访问速度的数据库-将哈希和salt连接到同一列将是非规范化的一个例子。

    把盐和杂碎分开的一个原因是你打算寻找其中的一个或另一个。在我看来,这不太可能是你想做的事情,所以继续把它们串联起来存储。