【问题标题】:How to handle BCrypt hashed passwords?如何处理 BCrypt 散列密码?
【发布时间】:2012-07-09 02:21:28
【问题描述】:

这个例子取自http://php.net/manual/en/function.crypt.php

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')

首先:如果散列方法是 BLOWFISH,盐的长度是多少?

这是我为上述示例得到的输出:

$2a$07$usesomesillystringsaled/4C6/vYhuH1f.Z/Kwf8X.c.e0jjHay

是否有意将我使用的盐、轮数和散列方法存储在返回的字符串中?当我存储在此行为中散列的密码时,是否存储以 $2a 开头的整个字符串?

根据数据库中的密码检查输入的密码时,如果没有任何东西将其与哈希的其余部分分开,我如何从字符串中检索盐?

编辑:为什么这种方法比使用 SHA512/256 更安全?如果有人对一堆带有盐的哈希使用字典攻击/蛮力方法,他们能更快地破解密码吗?

【问题讨论】:

    标签: php hash bcrypt


    【解决方案1】:

    是的,在字符串中存储盐和其他加密参数是有意的;当必须更新轮数时,它可以节省您手动执行的操作并保持向后兼容性。

    至于盐的有效字符数,it is 22。因此,这两行将产生相同的哈希:

    crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')
    crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalp$')
    

    至于查看数据库的结果,只需使用数据库本身的字符串作为crypt的参数即可。

    Here is a demonstration.

    【讨论】:

      【解决方案2】:

      1) 您需要一个 22 个字符的盐,但并非所有字符 22 位都被使用。这意味着你可以得到相同的哈希,一组不同的字符 22。

      2) 将盐和轮次存储在生成的哈希中确实是有意的。这样,您可以从现有哈希中提取此信息,并使用它来检查用户输入。您应该存储整个哈希,长度为 60 个字符。

      3) 您不需要从哈希中提取参数来对其进行测试,PHP 函数 crypt() 会为您执行。只需将现有哈希作为新的 crypt 参数传递。我试图在文章password hashes with bcrypt 中解释如何做到这一点。如果您正在寻找一个知名的图书馆,您可以查看phpass

      4) 更安全,因为它需要一定的 CPU 时间。其他哈希被设计得很快,但这使得每秒使用数十亿个密码进行暴力攻击成为可能。稍后可以根据成本因素对新一代计算机所需的时间进行调整。

      【讨论】:

        猜你喜欢
        • 2019-07-11
        • 2021-01-09
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多