4

你知道如何在 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)
4

4 回答 4

4

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 的一些其他改进。

于 2011-04-07T00:50:35.167 回答
3

从这里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 变体。

于 2015-03-04T11:16:41.497 回答
1

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

于 2010-11-01T16:09:49.283 回答
0

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

crypt文档

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

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

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

NAME 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 种不同方式之一扰乱算法。

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

警告:密钥空间由 2**56 个等于 7.2e16 个可能的值组成。使用大规模并行计算机可以对这个关键空间进行详尽的搜索。可以使用诸如crack(1) 之类的软件来搜索该密钥空间中通常被人类用于密码的部分。因此,密码选择至少应避免使用常用词和名称。建议使用 passwd(1) 程序在选择过程中检查可破解密码。

DES 算法本身有一些怪癖,这使得使用 crypt() 接口对于除了密码身份验证之外的任何事情都是一个非常糟糕的选择。如果您打算将 crypt() 接口用于加密项目,请不要这样做:获取一本关于加密的好书和一个广泛可用的 DES 库。

于 2010-11-01T16:07:27.013 回答