首页 > 解决方案 > 如何获取 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”并获得“密码”的结果

标签: phpsecuritycryptographypassword-hashpbkdf2

解决方案


简短的回答:你不能。我可以推荐这种方法吗?


更长的答案(摘自这篇向开发人员解释密码学术语的文章):

许多开发人员认为密码应该加密,但这是错误的。密码应该是散列的,而不是加密的。此外,不要将密码散列算法与简单的加密散列函数混淆。它们不是一回事:

比较加密哈希与密码哈希的表

与密码散列不同,密码散列需要多个输入参数。但与加密算法不同,密码哈希是单向确定性陷阱门计算。同样与密钥加密不同,盐不需要保密;它只需要每个用户都是唯一的。每个用户唯一的盐的目的是阻止预计算,并使从哈希列表中暴力猜测密码的成本更高。

该函数hash_pbkdf2()是一种散列函数,因此您无法对其进行解密

此外,它使用的算法名称是 PBKDF2,基于密码的密钥推导函数# 2。它旨在将密码(低熵的人类来源和人类记忆输入)转换为安全的加密密钥。它在后台执行此操作的方式导致很多人使用 PBKDF2 作为密码哈希。

虽然 KDF 和密码哈希算法之间存在一些关键差异,但为了回答这个问题,它们本质上是相同类型的算法

那么“如何[解密]这个 PBKDF2 输出?”的答案是什么?是:你不能。

哈希函数是单向的。有无限的输入可以产生任何给定的哈希输出,但由于输出密钥空间非常大,具有安全的哈希函数,因此在计算上产生冲突是不可行的。

密码散列函数(和密钥派生函数)也是如此,但以下情况会加剧:

  1. 迭代哈希
  2. (在某些情况下)内存硬算法设计使得很难通过使用并行处理来执行暴力攻击。

解决方案是为工作使用正确的工具。如果您不知道那是什么,请从这里开始,以便您了解这些术语,然后查看此答案以获取示例代码


推荐阅读