获取'sha512'加密文本的实际文本

Der*_*ole 3 javascript php cryptography change-password sha512

所以我正在开发一个使用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);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我的想法是通过输入他们的电子邮件重置用户密码并生成随机的8个字符,然后将其直接发送到他们的电子邮件.我现在面临的问题是如何获取已生成的实际密码(未加密),以便它可以自动发送到请求重置密码的成员的电子邮件中?

Ale*_*lex 5

好问题.

首先,您不应该以明文形式向用户发送密码. 出于某些原因,它被认为是一种糟糕的安全措施.如果有人访问该电子邮件,则他们拥有密码并可以劫持该用户帐户.其次,散列是一种单向加密形式,您可以将密码变为乱码.散列的最大价值在于,每次使用相同的密码时,相同的密码都会变成相同的乱码.这意味着您可以在不存储原始密码的情况下进行密码匹配.你应该散列密码而不是像AES-256这样的双向加密的原因是双向加密需要创建,管理和保护加密密钥,这很难.对于绝大多数开发人员而言,散列更容易,更安全.

那么如果你不能发送原始密码,你应该如何实现密码重置? 您向用户发送一封电子邮件,其中包含指向安全重置页面的链接以及在特定窗口内到期的一次性使用重置令牌.这样,如果有人可以访问电子邮件,那么风险窗口仅限于短窗口.

有多种方法可以自己构建,但是获得一次性使用令牌的简单方法就是将用户管理卸载到像Stormpath这样的微服务中,它负责所有用户管理.为您 - 密码重置,密码存储,用户配置文件,身份验证等

对于密码重置,这里是它的样子:

用户在网页上启动密码重置工作

  1. 您使用用户的电子邮件地址或用户名对stormpath进行API调用
  2. Stormpath通过链接+令牌向用户发送重置电子邮件(您的"来自"地址,自定义HTML等).重置令牌是唯一的,一次性使用,如果在24小时内未使用则过期
  3. 用户点击链接并登陆重置页面
  4. 您从URL中提取令牌并检查Stormpath以进行令牌验证
  5. 用户提交新密码
  6. Stormpath发出重置成功消息(您的"来自"地址,自定义HTML等)

您可以在此流程中构建自己的UI,以便用户永远不会知道存在Stormpath.

现在,您无需管理,存储或保护数据库中的任何密码或重置令牌.

以下是社区管理的PHP SDK的一些链接.
http://docs.stormpath.com/php/quickstart/ http://docs.stormpath.com/php/product-guide/

完全披露 - 我在Stormpath工作