所以我正在开发一个使用php,mysql和javascript的网站,以及' sha512'使用代码加密成员的密码:
$password = filter_input(INPUT_POST, 'p', FILTER_SANITIZE_STRING);
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
$password = hash('sha512', $password . $random_salt);
p
值来自:
function formhash(form) {
var password = randomString();
var p = document.createElement("input");
form.appendChild(p);
p.name = "p";
p.type = "hidden";
p.value = hex_sha512(password.value);
password.value = "";
form.submit();
}
function randomString() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < 9; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
我的想法是通过输入电子邮件重置用户密码并生成随机的8个字符,然后将其直接发送到他们的电子邮件中。 我现在面临的问题是如何获取已生成的实际密码(未加密),以便自动发送到请求重置密码的成员的电子邮件中?
答案 0 :(得分:5)
好问题。
首先,您不应该以明文形式向用户发送密码。出于某些原因,这被认为是一种糟糕的安全措施。如果有人访问该电子邮件,则他们拥有密码并可以劫持用户帐户。其次,散列是一种单向加密形式,您可以将密码变为乱码。散列的最大价值在于,每次使用相同的密码时,相同的密码都会变成相同的乱码。这意味着您可以在不存储原始密码的情况下进行密码匹配。你应该散列密码而不是像AES-256这样的双向加密的原因是双向加密需要创建,管理和保护加密密钥,这很难。对于绝大多数开发人员而言,散列更容易,更安全。
那么,如果您无法发送原始密码,应该如何实施密码重设? 您向用户发送一封电子邮件,其中包含指向安全重置页面的链接以及在特定窗口内到期的一次性使用重置令牌。这样,如果有人可以访问电子邮件,那么风险窗口仅限于短窗口。
有很多种方法可以自己构建,但是获得一次性使用令牌的简单方法就是将用户管理卸载到像Stormpath这样的微服务中,它可以处理所有这些问题。用户管理 - 密码重置,密码存储,用户配置文件,身份验证等
对于密码重置,这里的内容如下:
用户在网页上启动密码重置工作
您可以在此流程中构建自己的UI,以便用户永远不会知道存在Stormpath。
现在,您无需在数据库中管理,存储或保护任何密码或重置令牌。
以下是社区管理的PHP SDK的一些链接 http://docs.stormpath.com/php/quickstart/ http://docs.stormpath.com/php/product-guide/
完全披露 - 我在Stormpath工作
答案 1 :(得分:4)
以及加密密码的'sha512'
你没有对它们进行加密,你正在对它们进行哈希处理。哈希是一种单向函数。您无法获取散列函数的结果并获取原始函数。有许多可能的原始数据块可能导致相同的哈希值。
在这种情况下,哈希的重点是能够在不实际存储用户密码的情况下检查密码。您不应该通过电子邮件向用户发送密码,因为电子邮件是通过互联网未加密发送的。如果由于某种原因必须具有原始的预先散列数据,则必须在散列之前存储它。