php
  • bcrypt
  • crypt
  • 2016-07-21 41 views 1 likes 
    1

    在我们开始之前:是的我知道我应该使用PHP的password_hash函数,当实际上存储密码。这是一个关于PHP哈希系统内部的问题。PHP bcrypt不一致的盐

    所以我在前几天搞乱了PHP的crypt函数,我注意到bcrypt有一些奇怪的行为。

    $password = "totallyagoodpassword"; 
    $salt = "hereisa22charactersalt"; 
    
    $parameter = '$2y$10$' . $salt; 
    
    echo $parameter . PHP_EOL; 
    echo crypt($password, $parameter); 
    

    根据PHP's manual,此代码应哈希 “totallyagoodpassword” 使用bcrypt,盐析为 “hereisa22charactersalt”。该散列的输出应该是方案(“$2y$10$”),接着是盐的22个字符,然后是31个字符的散列。因此,我应该预期“$2y$10$hereisa22charactersalt”,然后是31个随机的base64字符。

    于是我运行代码:

    $2y$10$hereisa22charactersalt 
    $2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG 
    

    我不禁注意到我传入crypt盐和说出来的盐是如何不一样的;具体而言,最后一个角色神奇地变成了“e”。在用不同的salt运行这个之后,我仍然会得到同样的怪癖,即输出哈希的最后一个字符是唯一不同的。

    我不是PHP的开发人员,所以我确信这种行为背后有一些逻辑。但我很好奇。

    回答

    0

    该文档没有声明输出将包含整个22字节的盐。此外,crypt documentation上的示例显示盐的最终“$”。

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

    生产:

    $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

    +0

    大部分的研究,我上完成bcrypt似乎表明盐是128位,其中以base64(忽略填充)编码时,使最多22个字符。对我来说,PHP并不需要22个字符,然后不会全部使用它们。 另外我尝试了和没有最后的“'''”,它似乎没有任何区别。 – Kilo

    相关问题