【问题标题】:Is there a standard way to store passwords in a DB?有没有标准的方法将密码存储在数据库中?
【发布时间】:2012-02-06 04:45:44
【问题描述】:

所以密码不应该以明文形式存储,但很多人还是这样做了。对于其他人,是否有标准的密码存储方式?我的意思是 SHA1 哈希或 MD5 哈希,如果是这样,盐的大小是多少?有更好的地方问这个吗?

我正在尝试挑选从事目录服务工作的系统管理员和顾问的大脑。我想看看是否有模式。

编辑:我想澄清一下,我并不是想自己学习如何更好地存储密码,而是更多地尝试了解它们的存储方式有多少以及是否有标准。

【问题讨论】:

标签: security active-directory passwords


【解决方案1】:

MD5坏了一段时间,SHA-1也有问题。

如果您想存储一个在未来很长一段时间内都是安全的哈希,SHA-256 或 SHA-512(SHA-2 哈希系列的一部分,设计为 SHA-1 的安全替代品)是不错的选择,128 到 256 位的盐是标准的。

但是,现在使用普通哈希并不是最好的方法。 自适应哈希是专门为这种类型的存储设计的,因为计算结果所需的时间可以通过额外的计算来减慢。这是防止对您存储的密码进行暴力攻击的一个非常重要的特征。一个强大的、标准的自适应散列实现是 bcrypt,它基于对 Blowfish 加密算法的修改以使其适合此目的 (which is explained well here)。

【讨论】:

    【解决方案2】:

    密码应该被散列并且散列应该被存储在数据库中。 然而 SHA* 和 MD5 是一种太快的散列算法,无法用于散列密码。 对于散列密码,理想情况下,您需要速度慢得多的东西,它不适合暴力破解/彩虹表攻击。

    您可以确保在存储哈希之前对密码进行 1000 次哈希处理,以增加时间和计算量,但是当您拥有像 bcrypt 这样的算法可以为您完成这项工作时,为什么还要这样做呢。

    您应该使用 bcrypt 对您的密码进行哈希处理。阅读更多关于它的信息 http://codahale.com/how-to-safely-store-a-password/

    在 bcrypt 中,由于 salt 被附加到 hash - 你甚至不需要表中的两列“password_hash”和“salt”。只是'password_hash'。越少杂乱越好。

    【讨论】:

    • 我希望投反对票的人能解释为什么他认为 bcrypt 将是一个糟糕的选择(或者无论投反对票的原因是什么)!
    【解决方案3】:

    您可以查看this question 来了解盐应该多长的答案(128-256 位之间似乎是共识)。

    至于使用什么算法,你绝对应该使用 SHA1。 MD5 在很久以前就被认为是损坏的,尽管它仍然很常用(参见wikipedia MD5

    【讨论】:

    • 虽然 SHA1 比 MD5 好得多,但它并不是为存储密码而设计的。你应该使用bcrypt 之类的东西。查看@jeffsix 和@Shivam 的答案
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2023-03-09
    • 2013-08-20
    • 2012-09-13
    • 2016-01-15
    • 2011-06-13
    相关资源
    最近更新 更多