解码哈希sha256加密,知盐

Posted

技术标签:

【中文标题】解码哈希sha256加密,知盐【英文标题】:Decode hash sha256 encryption, knowing the salt 【发布时间】:2013-09-11 02:55:12 【问题描述】:

我正在为 Web 应用程序制作登录系统。为了在数据库中存储密码,我使用 sha256 对密码进行加密,如下所示:

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
echo "<center>".$hashedPW."</center>";

在数据库中,我存储了用户、用户密码以及用于生成哈希和验证用户登录的盐。现在我正在做的功能是向用户发送一封包含您的密码的电子邮件,但是当用户收到电子邮件时,由于存储在 sha256 加密密码中,用户会收到一个长字符串而不是用户应该的密码要知道。

我的问题是有什么方法可以向您发送实际的用户密码而不是密码加密,即,如果我知道盐,有什么方法可以反转 sha256?如果不可能,建议您使用哪种加密方法来完成加密密钥的反向并通过电子邮件将实际密码发送给用户。

【问题讨论】:

哈希的全部意义在于您无法将其反转以获取原始值;您也不应该将原始密码发送给忘记密码的用户 - 您向他们发送一个一次性的、有时间限制的链接以重置他们的密码 哈希应该是不可逆的(至少在理想世界中)。如果您将密码恢复系统建立在反转您自己的哈希值的基础上,您应该重新考虑您在做什么。您基本上是在尝试破解自己。不过,对这个问题 +1,因为其他人可能有同样的疑问,你的问题很有用。 @Renan 不一定,用户必须在DB中,密码发到用户个人邮箱。 马克和我想说的是,当您想以永远不应该解密的方式加密一段数据时,您会使用哈希。然后存储结果。如果您散列另一条数据并得到相同的结果,那么它很可能等于您首先散列的原始数据。这就是哈希认证的工作原理。关键是,如果黑客复制了您的数据库,他将无法从哈希中反转用户的密码。有办法做到这一点,但你至少让脚本小子更难了。 您不会向用户发送随机密码;您在密码重置链接中向他们发送一次性令牌 【参考方案1】:

正如您问题的 cmets 中所述,反转哈希并不是一个真正的选择。

但是,您可以做的,其他人也可以做。在您的表单发布给您的注册码(例如 register.php)中,您可以让 PHP 脚本通过电子邮件发送密码,然后对其进行加密并将其存储在数据库中。

我想您有某种形式的注册表单,并且该表单据说会将新用户的详细信息发布到另一个(或相同的)php 脚本,不是吗?

例如,如果我的表单说类似&lt;form method="post" action="register.php"&gt;

然后在register.php 中我会得到类似的东西

<?php
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']); /*cleartext*/
$email    = mysql_real_escape_string($_POST['email']);

mail($email,"New account","Your username \"$username\" and your password is \"$password\"");

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);

mysql_query("INSERT INTO users (username, password, email) VALUES ($username, $hashedPW, $email)")

一些粗略的示例代码。希望对你有帮助!

【讨论】:

快乐是我的 :)【参考方案2】:

您绝不应该通过电子邮件发送明文密码。而是按照 cmets 中的建议发送一个有时间限制的一次性“重置密码”链接。

您应该使用@Henrik 建议的简单哈希。使用标准的可调整工作密码 KDF (PBKDF2,bcrypt,scrypt)

如果您可以使用 PHP 5.5,请使用 standard password hashing functions。有些主机确实支持 PHP 5.5,但您必须寻找它们并要求它。

网络上有很多地方解释了如何正确地做到这一点(例如https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication),还有很多地方解释了如何不正确地做到这一点。在您决定推出自己的身份验证系统之前,请花一些时间研究一下。

【讨论】:

将github.com/ircmaxell/password_compat 添加到 PHP 5.3.7 比我之前想象的要容易 - 可能比迁移到 PHP 5.5 主机更容易。

以上是关于解码哈希sha256加密,知盐的主要内容,如果未能解决你的问题,请参考以下文章

Go语言实现md4md5sha256哈希算法加密

自带CA ,sha256 哈希签名,2048 位加密 脚本,通用

hmac sha256和sha256的区别

sha256双向加密吗

AES128_CBC_NoPading加密、sha256withRSA签名

用于登录密码的 PHP 盐和哈希 SHA256