在网络世界中,密码是我们保护个人账户安全的第一道防线。但是我们经常会遇到忘记密码的情况,而大多数网站在这种情况下只提供密码重置服务,而不是直接告诉我们原始密码。这是为什么呢?

分析

为了确保密码的安全性,通常采用哈希算法来存储密码。哈希算法是一种单向加密过程,它可以将任意长度的输入数据转换成固定长度的输出,但这个过程是不可逆的。

以SHA-256算法为例,如果你的密码 "Password123" 通过SHA-256哈希后,将会得到一个64位的哈希值。这个哈希值是唯一的,即使有其他用户设置了相同的密码,由于哈希算法的特性,他们的哈希值也将是相同的。网站将这个哈希值存储在数据库中,而不是你的原始密码。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sha256加密</title>
</head>

<body>
    <input type="text" id="password">
    <button id="hash_btn">一键加密</button>
    <div>
        <p><span>加密结果:</span><span id="result"></span></p>
    </div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script>
    document.getElementById("hash_btn").addEventListener('click', function () {
        const password = document.getElementById("password").value;
        const sha256 = CryptoJS.SHA256(password);
        const sha256_str = sha256.toString(CryptoJS.enc.Hex);
        document.getElementById("result").innerText = sha256_str;
    })
</script>

</html>

此外即使输入数据只存在微小变化,也会导致哈希值的巨大变化,这使得破解哈希值变得极其困难。但是理论上仍存在哈希碰撞的可能性,即两个不同的输入可能产生相同的哈希值。为了降低这种风险,网站通常会使用盐值(Salt)技术。盐值是一个随机生成的数据片段,它会与用户的密码结合后再进行哈希处理。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input type="text" id="password">
    <button id="hash_btn">一键加密</button>
    <div>
        <p><span>使用盐1加密:</span><span id="result1"></span></p>
        <p><span>使用盐2加密:</span><span id="result2"></span></p>
    </div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script>
    document.getElementById("hash_btn").addEventListener('click', function () {
        const password = document.getElementById("password").value;
        const salt1 = 'salt1';
        const salt2 = 'salt2';
        const result1 = CryptoJS.SHA256(password + salt1).toString(CryptoJS.enc.Hex);
        const result2 = CryptoJS.SHA256(password + salt2).toString(CryptoJS.enc.Hex);
        document.getElementById("result1").innerText = result1;
        document.getElementById("result2").innerText = result2;
    })
</script>

</html>

在用户登录时,系统并不是直接比较用户输入的密码和数据库中存储的哈希值。这是因为哈希值是不可逆的,无法直接比对原始密码和哈希值。系统需要执行以下步骤来验证用户的身份:

  1. 对接收到的密码执行与存储在数据库中相同的哈希算法,并添加相同的盐值(如果使用了盐值)
  2. 将新生成的哈希值与数据库中存储的哈希值进行比较
  3. 如果这两个哈希值相匹配,那么系统就会认为用户输入的密码是正确的

结论:

  • 由于网站存储的是密码的哈希值而不是原始密码,当用户忘记密码时,网站无法提供原密码。
  • 网站只能引导用户通过重置密码的方式来确认账户所有权。用户设置的新密码将被哈希处理并存储,替换掉之前的哈希值。这样做不仅保护了用户的密码安全,也符合现代网络安全的最佳实践。

标签: 暂无标签