我对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
顺利运行?
答案 0 :(得分:2)
通过阅读password_hash
中的$aa$bb$
手册,bb
aa
似乎代表了"费用"使用的算法和2y
似乎(至少目前)总是$2y$10$
。
$2y$10$
的部分是否会暗示使用了什么algorythm,让攻击者更容易知道原始字符串是什么?
是的,它会提示,但
为什么使用
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_DEFAULT
和Notice: Undefined index: page in C:\xampp\htdocs\paginate\page.php on line 11
,他们也不应该破解它。