如何获取PHP hash_pbkdf2递减值

时间:2018-09-17 11:16:04

标签: php security cryptography password-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”并获得“密码”的结果

1 个答案:

答案 0 :(得分:2)

简短的回答:您不能。我可以推荐this approach instead吗?


更长的答案(摘录自this article,向开发人员解释了加密术语)

  

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

     

Table comparing cryptographic hashes versus password hashes

     

与密码哈希不同,密码哈希需要多个输入参数。但是与加密算法不同,密码哈希是一种确定性的陷阱门计算。与密钥加密不同的是,salt不需要保持秘密。每个用户只需要唯一即可。每位用户使用唯一盐的目的是阻止预计算,并使从哈希列表中进行暴力猜测的密码更昂贵。

函数hash_pbkdf2()是一种哈希函数,因此you cannot decrypt it

此外,它使用的算法的名称为PBKDF2,或称为 P 密码- B 已定义 K ey D eriving F 功能# 2 。它旨在将密码(来自人的低熵且易于记忆的输入)转换为安全的加密密钥。这样做的方式导致许多人使用PBKDF2作为密码哈希。

尽管KDF和密码哈希算法之间存在一些关键区别,但出于 this 答案的考虑,它们实际上是同一类型的算法

那么“如何[解密]此PBKDF2输出的答案”?是:您不能。

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

密码散列函数(和密钥派生函数)也是如此,但加剧了:

  1. 盐腌
  2. 迭代哈希
  3. (在某些情况下)内存困难的算法设计使使用并行处理难以执行brute force attack

解决方案是使用正确的工具完成工作。如果您不知道这是什么,请start here,以便您了解术语,然后see this answer for example code