关于PHP的密码_hash()的问题

时间:2015-09-06 16:19:00

标签: php password-hash

我对PHP的password_hash函数有一些疑问。

我注意到了,如果

echo password_hash("12345", PASSWORD_DEFAULT);

然后我得到了一些像

的东西
$2y$10$PgMmle9Ue4o3m7ITJcGa0ucmWXSZgqbJBF9I4qd/aqzn/vQIwbi/O

所以我的问题是

1)$2y$10$的部分是否会暗示使用了什么algorythm并使攻击者更容易知道原始字符串是什么?

2)我可以在$2y$10$之后存储字符串,并在我必须使用密码时连接它吗?

3)为什么使用$2y$10$?这会改变未来吗?所以在我的数据库中,我的密码为$2y$10$,有些密码为$2y$25$?并且所有内容都可以使用password_verify顺利运行?

1 个答案:

答案 0 :(得分:2)

通过阅读password_hash中的$aa$bb$手册,bb aa似乎代表了"费用"使用的算法和2y似乎(至少目前)总是$2y$10$

  

$2y$10$的部分是否会暗示使用了什么algorythm,让攻击者更容易知道原始字符串是什么?

是的,它会提示,但

  1. 许多函数的字符串的其余部分也是如此(例如,md5 / sha1哈希值总是由32/40十六进制字符组成)。
  2. 这不应该是一个问题,因为你不应该依赖于混淆,而是依靠强大的算法(正如arkascha在his comment中正确指出的那样)。
  3.   

    为什么使用the "$2y$" identifier

    因为有人认为这是个好主意。

      

    将来会改变吗?

    我是这么认为的 第二部分已经变化,第一部分在the manual中被称为$2y$10$,但不保证不会添加其他标识符。

      

    因此,在我的数据库中,我的密码为$2y$25$,有些密码为password_hash(..., PASSWORD_DEFAULT)?并且使用password_verify可以顺利运行一切?

    看看examples in the manual - 已经是这样的了 $2y$10$似乎生成password_hash(..., PASSWORD_BCRYPT, ['cost' => 12])前缀,但$2y$12$生成$2y$10$

      

    我可以在$password = password_hash("12345", PASSWORD_DEFAULT); $key = pack('H*', md5('lorem').md5('ipsum')); // Must be 16, 24 or 32 bits $secret = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $password, MCRYPT_MODE_ECB); // Store $secret in the database 之后存储字符串,并在我必须使用密码时连接它吗?

    我会反对这一点 您可能会使它工作,甚至可能阻止它破坏任意更改,但如果您唯一担心的是加密字符串提示使用的加密方法,更好的选择是添加额外的对称加密层。
    例如:

    password_hash

    这样,如果攻击者没有您的源代码,他们就无法告知加密数据意味着什么,如果他们确实可以访问您的源代码,他们可以只看一下加密的内容。无论如何都在使用。

    但同样,即使攻击者知道正在使用PASSWORD_DEFAULTNotice: Undefined index: page in C:\xampp\htdocs\paginate\page.php on line 11,他们也不应该破解它。