【问题标题】:PHP: crypt() function returns same string if base string has only slight variationPHP:如果基本字符串只有轻微变化,则 crypt() 函数返回相同的字符串
【发布时间】:2012-03-01 19:43:49
【问题描述】:

我在使用 crypt 时遇到问题。我正在为客户重建网站。所以从以前的版本中继承了很多代码。我必须保持网站的原始数据库完好无损,所以我必须小心我在代码方面所做的更改。以前的开发人员使用 crypt() 函数来创建用户密码的哈希值以进行存储。我看到的奇怪效果是,同一个密码的细微变化有时会产生完全相同的哈希值。我不太了解 crypt 的工作原理,但在我看来,这不应该发生。这里有一些代码可以作为示例。

echo crypt('Colliedog6','wfd')."\n";
echo crypt('Colliedog10','wfd')."\n";

这会在我的服务器上返回相同的哈希字符串。我正在使用该盐字符串,因为这是以前的开发人员使用的,并且所有当前密码都是使用该盐字符串制作的,所以我真的需要使用它,除非我们想强制所有用户重置密码。这不一定是不可能的,但我们想避免它。为什么 crypt 会像上面那样采用两个略有不同的字符串并创建相同的哈希?

【问题讨论】:

    标签: php crypt


    【解决方案1】:

    来自the docs

    基于标准 DES 的 crypt() 将 salt 作为输出的前两个字符返回。它也只使用 str 的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。

    【讨论】:

    • 显然,当我在错过之前浏览该页面时。谢谢。看起来网站上正在实施新的密码系统:)
    • 几周前我们在工作中讨论过这个问题,这里的共识是使用 bcrypt:en.wikipedia.org/wiki/Bcrypt 这允许未来通过增加迭代次数来增强安全性。只需记住存储哈希值上使用的迭代,以便在它更改时确定有效匹配。
    【解决方案2】:

    因为crypt() 会忽略第 8 位之后的字符。像往常一样,阅读 PHP 手册/文档是一个很好的起点——在 PHP 中有很多类似的问题:http://php.net/manual/en/function.crypt.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2015-07-31
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多