获取“sha512”加密文本的实际文本


Get the actual text of an 'sha512' encrypted text

所以我正在使用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 个字符,然后将其直接发送到他们的电子邮件。我现在面临的问题是如何获取已生成的实际密码(未加密(,以便将其自动发送到请求重置密码的成员的电子邮件?

好问题。

首先,切勿以明文形式向用户发送密码。 由于几个原因,它被认为是一种糟糕的安全做法。 如果有人可以访问该电子邮件,则他们拥有密码并可以劫持用户帐户。 其次,散列是一种单向加密形式,您可以将密码转换为胡言乱语。 散列的最大价值在于,相同的密码每次都会变成相同的胡言乱语。 这意味着您可以在不存储原始密码的情况下进行密码匹配。 您应该散列密码而不是像 AES-256 那样进行 2 路加密的原因是,2 路加密需要创建、管理和保护加密密钥,这可能很难。 对于绝大多数开发人员来说,哈希更容易、更安全。

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

有多种

方法可以自己构建它,但获取您不必存储或管理的一次性使用令牌的一种简单方法是将用户管理卸载到 Stormpath 这样的微服务,在那里它为您处理所有用户管理 - 密码重置、密码存储、用户配置文件、身份验证等。

对于密码重置,如下所示:

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

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

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

现在,您不必管理、存储或保护数据库中的任何密码或重置令牌。

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

全面披露 - 我在风暴路径工作

还有"SHA512"来加密密码

你不是在加密它们,而是在散列它们。 哈希是单向函数。 您不能获取哈希函数的结果并获取原始结果。 有许多可能的原始数据块可以产生相同的哈希。

在此上下文中,哈希的全部意义在于能够在不实际存储用户密码的情况下检查密码。 您不应通过电子邮件向用户发送密码,因为电子邮件是通过未加密的 Internet 发送的。 如果出于某种原因必须具有原始的预哈希数据,则必须在对其进行哈希处理之前存储它。