【问题标题】:Blowfish salt length for the Crypt() function?Crypt() 函数的河豚盐长度?
【发布时间】:2011-06-08 16:11:33
【问题描述】:

根据crypt() documentation,salt 必须是字母表“./0-9A-Za-z”中的 22 个基数为 64 位的数字。

这是他们给出的代码示例:

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

第一个令人困惑的部分是 salt 有 25 个字符,而不是 22 个。

问题 #1:这是否意味着盐应该长于超过 22 个字符?

然后我自己测试了这个函数并注意到了一些东西。如果我使用 20 个字符的盐,我会得到这个

// using 20 char salt: 00000000001111111111
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$');
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2

所以,当我使用 20 个字符的 salt 时,整个 salt 都在输出中。这很方便,因为那时我不必将盐存放在单独的地方。 (我想使用随机盐)。我将能够从生成的哈希中读取盐。

但是,如果我按照文档所述使用 22 个字符的盐,或者使用更长的盐,盐会在最后被切断。

// using 22 char salt: 0000000000111111111122
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122$');
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui
// 22nd character of the salt is gone

// using 25 char salt: 0000000000111111111122222
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122222$');
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui
// Same hash was generated as before, 21 chars of the salt are in the hash

问题 #2: 那么,盐的正确长度到底是多少? 20? 22?更长?

问题 #3: 另外,在检查密码时从哈希中读取盐值是否是个好主意?而不是将盐存储在一个单独的字段中并从那里读取它。 (这似乎是多余的,因为盐似乎包含在哈希中)。

【问题讨论】:

    标签: php passwords cryptography hash blowfish


    【解决方案1】:

    河豚盐应该是 22 个字符长(包括尾随的 $,所以 21)- 你可以用 var_dump(CRYPT_SALT_LENGTH) 仔细检查,我现在无法验证这一点,但我的猜测是更少的字符会返回错误和更多的字符将被截断。

    关于您的第三个问题:是的,您应该使用哈希本身的嵌入式盐(和成本)参数读取并检查哈希。

    【讨论】:

    • CRYPT_SALT_LENGTH 在我的 Win7 机器上返回 60,在 Ubuntu 上返回 123。
    • @Burak Guzel:根据手册 PHP 设置了一个名为 CRYPT_SALT_LENGTH 的常量,表示可用哈希允许的最长有效盐
    • @Burak Guzel:CRYPT_SALT_LENGTH 在 PHP 5.3.1 之前返回 60,但从 5.3.2 返回 123。这是因为 SHA-256(64 char long salt)和 SHA-512(123 char long salt)是在 PHP 5.3.2 中引入的。
    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多