php - 如何获取 php hash_pbkdf2 破旧值
问题描述
我已经使用 PHP hash_pbkdf2 函数加密了字符串。请查看以下代码:
$password = "password";
$iterations = 10000;
$salt = 1111;
$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);
The result of hash value "61ea90120ac05230465c"
在加密中一切正常。
请让我知道如何减少值“61ea90120ac05230465c”并获得“密码”的结果
解决方案
简短的回答:你不能。我可以推荐这种方法吗?
更长的答案(摘自这篇向开发人员解释密码学术语的文章):
许多开发人员认为密码应该加密,但这是错误的。密码应该是散列的,而不是加密的。此外,不要将密码散列算法与简单的加密散列函数混淆。它们不是一回事:
与密码散列不同,密码散列需要多个输入参数。但与加密算法不同,密码哈希是单向确定性陷阱门计算。同样与密钥加密不同,盐不需要保密;它只需要每个用户都是唯一的。每个用户唯一的盐的目的是阻止预计算,并使从哈希列表中暴力猜测密码的成本更高。
该函数hash_pbkdf2()
是一种散列函数,因此您无法对其进行解密。
此外,它使用的算法名称是 PBKDF2,或基于密码的密钥推导函数# 2。它旨在将密码(低熵的人类来源和人类记忆输入)转换为安全的加密密钥。它在后台执行此操作的方式导致很多人使用 PBKDF2 作为密码哈希。
虽然 KDF 和密码哈希算法之间存在一些关键差异,但为了回答这个问题,它们本质上是相同类型的算法。
那么“如何[解密]这个 PBKDF2 输出?”的答案是什么?是:你不能。
哈希函数是单向的。有无限的输入可以产生任何给定的哈希输出,但由于输出密钥空间非常大,具有安全的哈希函数,因此在计算上产生冲突是不可行的。
密码散列函数(和密钥派生函数)也是如此,但以下情况会加剧:
- 盐
- 迭代哈希
- (在某些情况下)内存硬算法设计使得很难通过使用并行处理来执行暴力攻击。
解决方案是为工作使用正确的工具。如果您不知道那是什么,请从这里开始,以便您了解这些术语,然后查看此答案以获取示例代码。
推荐阅读
- php - 来自控制器的 Laravel 过滤器数据库
- rust - 为什么没有为包装 FnMut 的`std::cell::RefMut<'_, [..]>` 实现 DerefMut?
- c# - ExcelDataReader 不读取带有逗号的浮点数,例如“123,45”(而是读取“123.45”)
- angular - 如何根据下拉列表参数生成不同的对象并创建专用网页?
- java - 使用 JLabel 添加背景图像
- oracle - APEX ORACLE 如何从链接运行 SQL 过程
- php - Laravel 查询构建器绕过数据库视图子句
- ios - 如何模糊分段控件的背景?
- django - 为什么 FloatField 不接受输入浮点值?
- vue.js - 为什么在 props 中传入一个包含 4 个值的数组,在 data 中精确设置,导致 data 中的数组有 5 个值?