【问题标题】:PHP Crypt() versus Python's Crypt() For HashingPHP Crypt() 与 Python 的 Crypt() 用于散列
【发布时间】:2013-05-05 22:40:41
【问题描述】:

我正在比较 PHP 的 crypt() 和 Python 的 crypt()。来自阅读 Python 的手册:

http://docs.python.org/2/library/crypt.html

平台:Unix

这个模块实现了 crypt(3) 例程的接口,它是 基于改进的DES算法的单向散列函数;见 Unix 手册页以获取更多详细信息。可能的用途包括允许 Python 脚本接受用户输入的密码,或尝试 用字典破解 Unix 密码。

请注意,此模块的行为取决于实际 在正在运行的系统中实现 crypt(3) 例程。 因此,当前实现中可用的任何扩展都将 也可用于此模块。

crypt.crypt(word, salt) word 通常是用户的密码 在提示符或图形界面中键入。盐通常是 用于扰动 DES 的随机两个字符的字符串 4096 种方法之一的算法。 salt 中的字符必须在 设置 [./a-zA-Z0-9]。将哈希密码作为字符串返回,这将 由与盐相同的字母组成的字符( 前两个字符代表盐本身)。

通过阅读 PHP 的 Crypt:

http://php.net/manual/en/function.crypt.php

CRYPT_SHA512 - SHA-512 哈希,带有 16 个字符的盐,前缀为 $6$。如果盐字符串以 'rounds=$' 开头,则数字 N 的值用于指示散列循环应该执行多少次 执行,很像 Blowfish 上的成本参数。默认 轮数为 5000,最少 1000,最多 999,999,999。超出此范围的任何 N 选择都将被截断 到最近的限制。

公平地说,我不包括 Python 的第三方模块...我想比较 PHP crypt() 和 Python crypt() 两者的股票。

在阅读了这两篇文章并进行了比较之后......看起来 PHP Crypt() 使用了 SHA512,并且它的最大 999,999,999 散列轮数远远强于/优于 Python 的 Crypt()。这得到证实了吗?或者我没有正确阅读这个。

【问题讨论】:

    标签: php python hash crypt


    【解决方案1】:

    请注意,Python crypto 只是 crypt (3) 调用的包装器,您提到的文档是指基本 POSIX 版本,可在任何地方使用。正如文档所述,crypto 的大多数实现都进一步扩展了这一点:

    请注意,此模块的行为取决于运行系统中 crypt(3) 例程的实际实现。因此,当前实现中可用的任何扩展也将在此模块上可用。

    如果您查看glibc version(绝大多数Linux 系统都使用它),您会发现PHP 文档中列出的所有算法都已实现。另外,请查看 the source code of one crypt module 以了解是否支持迭代(轮次)参数。

    您问题中的 PHP 文档列出了所有算法,因此作者认为它将安装在具有最新 glibc 的系统上是理所当然的,或者他们设法在所有系统上模拟缺失的算法。

    【讨论】:

    • 我唯一遇到的问题是,crypto 是第三方制作的第三方模块。由于我们在谈论安全性,所以我必须依靠模块的维护者诚实并且没有任何恶意代码。
    • 第三方库是什么加密?只要坚持使用信誉良好、经过同行评审的开源软件,就可以了。
    • 是的,crypt.crypt(given, saved) == saved 可以满足我的需求。老实说,我的情况有点复杂:def password_match(saved, given): phash = (saved[:1] == '$') \ and crypt(given, saved) \ 或 sha1(given)。 hexdigest() 返回已保存 == phash
    • 太丑了。并且不能再编辑了...password_match = lambda(saved, given: saved == ((saved[:1] == '$') and crypt(given, saved) or sha1(given).hexdigest())) 抱歉无法让它看起来像 python 代码:(
    【解决方案2】:

    Python 的 crypt() 是 UNIX 等效项的代理,用于密码散列;其中 PHP 是一个通用的加密服务提供商; Python 有 hashlib module

    【讨论】:

    • hashlib 模块是否提供了像 PHP 的 Crypt() 那样进行散列循环的选项?还是 digest_size 弥补了它?如果确实如此...哪个更好...能够设置轮数或摘要大小?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多