去评论
dz插件网

discuz X3.5密码破解password_hash()反向转换为md5密码进行破解的方法

惧愁人
2022/12/29 15:23:46
discuz X3.5密码使用php内置函数password_hash() ,即可获得兼容Discuz系统的新密码。新密码的hash是一体的一个字符串,没有单独的salt,因此salt字段留空即可。

如果你想使用其他编程语言生成兼容Discuz系统的密码:请自行查询所使用语言的相关算法实现。由于Discuz采用的标准符合国际通用的密码存储最佳实践,因此跟标准的实现大多都是兼容的。
默认算法:bcrypt,也可以查询blowfish,也是它。
高版本php用户可选使用更安全的argon2i算法,但就不能再降级php了。



顺带一提,如果你实在就是做不到用新方法手动生成密码的话,这个是不强求的。
因为Discuz即便引入了新的更安全的密码保存规则,并不代表就直接放弃了对旧存储规则的兼容。
由于必须知道密码原文才有可能将其重新编码成新规则,对老规则的兼容还将持续存在很长很长的一段时间,否则老用户就没法登录了。
这意味着哪怕你仍然采用老方法在数据库里强行重置用户的密码,也是没问题的,只是会让系统多重置一次。



非对称加密函数password_hash()转换为Md5()的思路进行破解discuz X3.5密码:



md5+salt

直接使用MD5()加密,是很容易被破解的(犹记得曾经忘记密码,到处找免费的破解网站...),但加上salt想要破解就难上很多了,即使你获得salt和最终密文,想要破解也是十分困难的。

如何实现md5+salt?很简单,密码连接一个随机字符串即可。


password_hash

PHP5.5引入了Password Hashing函数,内核自带无需安装扩展,使用起来十分方便。它属于Password Hashing API(创建和校验哈希密码)函数之一。

Password Hashing API包含4个函数:

password_hash()、password_verify()、password_get_info()、password_needs_rehash()。

string password_hash(string $password, integer $algo [, array $options ])

参数:

$password 密码

$algo  哈希算法

$options  选项

实例:


上例输出结果类似:$$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a,并且刷新页面该哈希值也会不断的变化。


哈希值创建完毕,我们可以用password_verify()来校验密码是否和哈希值匹配。


boolean password_verify ( string $password , string $hash )

它接收2个参数:密码和哈希值,并返回布尔值。检查之前生成的哈希值是否和密码匹配,代码:


基本上使用以上这2个函数就能安全的创建和校验hash密码了。

总结


MD5+salt加密 可跨语言加密解密。

password_hash加密 只能通过php的password_verfiy校验。