【问题标题】:Creating a hash that doesn't include its salt in PHP在 PHP 中创建一个不包含盐的哈希
【发布时间】:2014-08-17 14:31:31
【问题描述】:

对于用户验证电子邮件,我想向我的用户发送一封电子邮件,其中包含基于用户 ID 和随机生成的盐的安全哈希。然而,所有 php 的函数都针对密码哈希,因此将盐存储在哈希中以进行密码验证。由于我打算向用户发送此哈希,因此没有必要这样做。

我知道 md5 函数不包含盐,但我相信 md5 哈希不安全。

有没有什么方法可以在 php 中散列(最好用一行代码)字符串并返回没有盐的纯散列?

【问题讨论】:

    标签: php encryption hash


    【解决方案1】:

    您可以在任何哈希中添加盐。它只是添加到您正在散列的任何内容的字符串。但是,此处使用的最佳方法是在服务器上随电子邮件地址一起存储的随机字符串。当用户尝试验证时,您将与随机字符串进行比较。然后,无需担心有人仅根据电子邮件地址的知识生成哈希。

    【讨论】:

      【解决方案2】:

      我不完全了解您的协议,但如果您只是在 PHP 中寻找安全哈希,请使用 hashalgo = "sha256"

      确保您了解使用 PHP 散列字符串时使用的(默认)字符编码。

      【讨论】:

        【解决方案3】:

        首先使用 base64_encode 进行散列,然后再使用 md5 对结果值进行散列。这将为您返回安全的哈希结果。

        【讨论】:

          【解决方案4】:

          据我了解,这根本不是盐,而是您想使用可以隐藏用户 ID 的 key。用户 ID 是您稍后要验证的内容。为了能够验证此用户 ID,您必须将密钥存储在某处。

          现在,如果您无论如何都必须存储此密钥,那么您可以采取更好的方法。生成一个 random 令牌,该令牌不是从任何现有数据派生的(并且不能泄漏任何内容),并将此令牌的哈希与用户 ID 一起存储在数据库中。您发送给用户的原始令牌。只要用户单击链接,您就可以使用存储的哈希验证令牌。

          因为随机令牌是一个非常强大的“密码”(大约 20 个随机选择的字符),所以在没有盐的情况下计算像 SHA-256 这样的简单哈希是绝对安全的。这允许在数据库中搜索散列令牌。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-05-04
            • 1970-01-01
            • 2011-05-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-02
            相关资源
            最近更新 更多