我已经使用 PHP hash_pbkdf2 函数加密了字符串。请查看以下代码:
$password = "password";
$iterations = 10000;
$salt = 1111;
$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);
哈希值“61ea90120ac05230465c”的结果
加密时一切正常。
请告诉我如何解密“61ea90120ac05230465c”值并得到“密码”结果。
简短回答:你不能。我可以推荐这种方法吗?
更长的答案(摘自这篇文章,向开发人员解释了密码学术语):
许多开发人员认为密码应该“加密”,但这是错误的。 密码应该是散列,而不是加密。此外,不要将密码哈希算法与简单的加密哈希函数混淆。它们不是同一件事:
与加密哈希不同,密码哈希需要多个输入参数。但与加密算法不同的是,密码哈希是单向确定性活板门计算。与秘密密钥加密不同的是,盐不需要保密;它只需要每个用户都是唯一的。每个用户唯一的盐的目的是阻止预计算并使从哈希列表中暴力猜测密码的成本更高。
函数
hash_pbkdf2()
是一种哈希函数,所以
你无法解密它。 此外,它使用的算法名称是 PBKDF2,或 P
assword-Based Key Derivation Function #2。它的设计目的是将密码(一种低熵、人类可记忆的输入)转换为安全的加密密钥。它在幕后执行此操作的方式导致很多人使用 PBKDF2 作为密码哈希。 虽然 KDF 和密码哈希算法之间存在一些关键差异,但为了
this答案,它们本质上是相同类型的算法。 那么“如何[解密]这个 PBKDF2 输出?”的答案是:
你不能。哈希函数是单向的。有无限的输入可以产生任何给定的哈希输出,但由于安全哈希函数的输出密钥空间非常巨大,因此在计算上不可能产生冲突。
密码散列函数(和密钥派生函数)也是如此,但情况会因以下原因而加剧:
盐腌使用适合工作的正确工具
。如果您不知道那是什么,从这里开始以便您理解这些术语,然后查看此答案以获取示例代码。