当前位置: 首页 > 知识库问答 >
问题:

解码哈希sha256加密,知道盐

施晗昱
2023-03-14

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

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

数据库中,我存储了用户、用户密码和用于散列和验证用户登录的salt。现在,我正在向用户发送包含您的密码的电子邮件,但是当用户收到电子邮件时,由于存储在sha256加密密码中,用户收到的是一个长字符串,而不是用户应该知道的密码。

我的问题是,我可以通过任何方法向您发送实际的用户密码和非密码加密,即,如果我知道盐,有一些方法可以反向执行sha256?如果无法实现,建议您使用哪种加密方法完成加密密钥的反转,并在电子邮件中将实际密码发送给用户。

共有2个答案

蒋芷阳
2023-03-14

你不应该通过电子邮件发送明文密码。相反,按照评论中的建议,发送一个有时间限制的一次性“重置密码”链接。

你不应该像@Henrik建议的那样使用简单的hash。使用标准的可调工作密码KDF (PBKDF2,bcrypt,scrypt)

如果你能使用PHP 5.5,使用标准的密码散列函数。有些主机确实支持PHP 5.5,但是你必须去找他们并索取。

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

姜永贞
2023-03-14

正如在你的问题的评论中提到的,反转散列并不是一个真正的选择。

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

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

例如,如果我的表单说类似

在< code>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)")

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

 类似资料:
  • 我是在阅读了一些关于php中会话管理的主题后开始进行安全讨论的,请查看:https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-termer-persistence#title.2 引自章节:胡椒还是不胡椒? 一个更好的解决方案是,在将散列插入数据库之前对其进行加密,如果使用硬件分离,这种解决方案尤其有用。有了这

  • 我已经对我的注册脚本中的密码进行了加密,它们存储在数据库中,我必须使用它们登录,所以我想使用未加密的密码登录。我已经阅读了这里的一些帖子,但没有任何帮助。我如何才能将其添加到我的登录中。php?盐也存储在数据库中。 这是我的登记簿。用于加密的php脚本 这是我的季节login.php

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 简介 Laravel Hash facade 为存储用户密码提供了安全的 Bcrypt 和 Argon2 哈希。如果您使用 Laravel 应用程序中内置的 LoginController 和 RegisterController 类,则默认情况下它们将使用 Bcrypt 进行注册和身份验证。 {tip} Bcrypt 是哈希密码的理想选择,因为它的「加密系数」可以任意调整,这意味着生成哈希所需的

  • 我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli

  • 问题内容: 给定密钥,有什么办法可以解密加密的MD5字符串? 问题答案: 尝试使用Google(请参阅使用Google破解MD5密码)或包含md5()之类的MD5散列的在线数据库;或GDATA(最后一个包含1,133,766,035个唯一条目)。