【问题标题】:use python to create compatible ldap password (md5crypt) on windows使用python在windows上创建兼容的ldap密码(md5crypt)
【发布时间】:2010-11-01 16:00:54
【问题描述】:

你知道如何在 Windows 上通过 python 创建一个兼容 ldap 的密码(首选 md5crypt)

我曾经在 Linux 中写过类似的东西,但 crypt 模块在 Windows 上不存在

char_set = string.ascii_uppercase + string.digits
salt = ''.join(random.sample(char_set,8))
salt = '$1$' + salt + '$'
pwd = "{CRYPT}" + crypt.crypt(str(old_password),salt)

【问题讨论】:

  • 你没有。您配置 OpenLDAP 或任何您的 LDAP 服务器对密码本身进行哈希处理,并且您始终通过 LDAPS 以明文形式提供密码,即基于 SSL 的 LDAP。在存储和比较登录目的时,LDAP 将进行必要的散列。

标签: python windows md5 crypt


【解决方案1】:

Passlib python 库包含所有 crypt(3) 算法的跨平台实现。特别是,它包含ldap_md5_crypt,听起来正是您想要的。以下是它的使用方法(此代码适用于 windows 或 linux):

from passlib.hash import ldap_md5_crypt

#note salt generation is automatically handled
hash = ldap_md5_crypt.encrypt("password")

#hash will be similar to '{CRYPT}$1$wa6OLvW3$uzcIj2Puf3GcFDf2KztQN0'

#to verify a password...
valid = ldap_md5_crypt.verify("password", hash)

我应该注意到,虽然 MD5-Crypt 得到广泛支持(Linux,所有 BSD,内部在 openssl 中),但它几乎不是可用的最强哈希真的非常不安全,应该尽可能避免。如果您想要与 linux crypt() 兼容的最强哈希,SHA512-Crypt 可能是要走的路。它在内部添加了可变轮次,以及对 MD5-Crypt 的一些其他改进。

【讨论】:

  • MD5 不仅仅是“不是最强的散列”,它几乎是字面上最弱的散列。在这一点上它已经被彻底破坏了很多年,如果在 OpenSSL 或 Python 中启用了标准合规模式,那么hashlib MD5 本身将不可用。 Because it's that bad,允许碰撞和降低难度的技术。 (请注意,该网站并没有像看起来已知的哈希那样“解密”它们。)它“得到广泛支持”,但也广为人知的是不安全,并且被广泛明确禁用。
  • 截至 2019 年,“不是最强哈希”绝对是轻描淡写。我同意,真的太糟糕了(只有 DES-crypt 更糟糕,这没什么好说的!)。 Passlib 已经将此哈希标记为“仅限历史使用”。我确实想指出,MD5-Crypt 在内部使用了 1000 轮 MD5,因此“解密 md5”站点无法用于反转 MD5-Crypt 哈希值;尽管像 JohnTheRipper 这样的饼干把它做成了肉馅。
  • 反向查找多重散列值不会有效,除非找到最后一轮的冲突。但是,MD5 是我系统上可用的最有效的散列算法之一。 OpenSSL(通过 CPU!)每秒可以处理 (openssl speed md5) 7230 万 个 MD5 哈希值;开膛手约翰肯定会很快搞定他们。在 1000 轮中……仍然是每秒 23.7K 次尝试。一个 6 个字符的相当复杂的密码可能提供多达 735,091,890,625 种组合,或者在最坏的情况下只需超过 10,000 秒(2.8 小时)即可破解。是的,就是这么糟糕。 (GPU 或 FPGA 更差。)
【解决方案2】:

从这里http://www.openldap.org/faq/data/cache/347.html

生成 SHA-hash 的变体之一可以是:

import sha 
from base64 import b64encode 

ctx = sha.new("your_password") 
hash = "{SHA}" + b64encode(ctx.digest())
print(hash)

此代码适用于 Python。

# python my_sha.py
{SHA}Vk40DNSEN9Lf6HbuFUzJncTQ0Tc=

我(不仅是我)建议再使用 MD5。

PS。按照链接,您可以尝试一些 windows 变体。

【讨论】:

  • 为 necrobump 道歉,但我觉得有必要指出这种方法(使用 unsalted hash)是危险且不安全的。这不仅仅是“不要使用MD5”(这对于轻型数据完整性来说仍然可以!),它也是“don't use unsalted hashes”。
【解决方案3】:

您需要使用fcrypt,它是Unix 模块crypt 的纯Python 实现。它比crypt 慢一点,但功能相同。

【讨论】:

  • fcrypt 只支持原来的 DES crypt 算法,不支持后来添加的任何$x$ 格式,如 md5crypt。
【解决方案4】:

免责声明:我知道 Google,而不是密码学。

来自crypt docs

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

你可以看看md5crypt.py。或者,crypt for WindowsGnuWin32 的一部分。这是一些 Unix 手册页; Windows 界面应该类似。

CRYPT(3) Linux 程序员手册
密码(3)

名称 crypt, crypt_r - 密码和数据加密

概要

   #define _XOPEN_SOURCE
   #include <unistd.h>

   char *crypt(const char *key, const char *salt);

   char *crypt_r(const char *key, const char *salt,
                 struct crypt_data *data);

与 -lcrypt 链接。

描述

crypt() 是密码加密函数。它基于 数据 具有预期变化的加密标准算法(在 其他 事物)阻止使用密钥的硬件实现 搜索。

key 是用户输入的密码。

salt 是从集合 [a–zA–Z0–9./] 中选择的两个字符的字符串。 这个 字符串用于扰乱 4096 种不同的算法之一 方式。

通过取前八个字符中每个字符的最低 7 位 的 密钥,得到一个 56 位的密钥。这个 56 位密钥用于 加密 重复一个常量字符串(通常是一个由 全部 零)。返回值指向加密后的密码,a 系列 13 个可打印的 ASCII 字符(前两个字符) 代表 盐本身)。返回值指向静态数据 内容 被每次调用覆盖。

警告:密钥空间由 2**56 等于 7.2e16 可能 价值观。 可以使用大量的方法对这个关键空间进行详尽的搜索 参数 等位计算机。可用的软件,例如crack(1),它 将要 搜索该密钥空间中通常由 人类 用于密码。因此,密码选择至少应: 避免 常用词和名称。使用 passwd(1) 程序检查 为了 建议在选择过程中使用可破解的密码。

DES 算法本身有一些怪癖,它们利用 这 crypt() 接口对于除此之外的任何东西都是一个非常糟糕的选择 密码 验证。如果您打算使用 crypt() 接口为 一个密码学项目,不要这样做:获得一本关于加密的好书 和 广泛使用的 DES 库之一。

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多