Bur*_*zel 10 php passwords hash cryptography blowfish
根据crypt()文档,salt需要是字母"./0-9A-Za-z"的22个64位.
这是他们给出的代码示例:
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
Run Code Online (Sandbox Code Playgroud)
第一个令人困惑的部分是盐有25个字符,而不是22个字符.
问题1:这是不是意味着盐应该是更长的超过22个字符?
然后我自己测试了这个功能并发现了一些东西 如果我使用20个字符的盐,我会得到这个
// using 20 char salt: 00000000001111111111
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$');
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2
Run Code Online (Sandbox Code Playgroud)
因此,当我使用20个字符的盐时,整个盐都在输出中.这很方便,因为我不必将盐存放在一个单独的地方.(我想使用随机盐).我将能够从生成的哈希中读取盐.
但是,如果我使用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
Run Code Online (Sandbox Code Playgroud)
问题2:那么,盐的长度到底是多少?20?22?更长?
问题3:此外,在检查密码时,从哈希中读取盐是否是个好主意?而不是将盐存储在单独的字段中并从那里读取.(这似乎是多余的,因为盐似乎包含在哈希中).
Blowfish盐应该是22个字符长(包括尾随$,所以21) - 你可以仔细检查 var_dump(CRYPT_SALT_LENGTH)
,我现在无法验证,但我的猜测是较少的字符将返回错误,更多的字符将被截断.
关于你的第三个问题:是的,你应该使用哈希本身的嵌入式salt(和cost)参数来读取和检查哈希值.