你知道如何通过Windows上的Python创build一个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)
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的一些其他改进。
从这里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变种。
你需要使用fcrypt ,它是Unix模块crypt
的纯Python实现。 这比crypt
更慢一点,但它具有相同的功能。
免责声明:我知道谷歌,而不是密码学。
从crypt
文档 :
该模块实现crypt(3)例程的接口,该例程是基于修改的DES算法的单向散列函数; 请参阅Unix手册页以获取更多详细信息。 可能的用途包括允许Python脚本接受用户输入的密码,或试图用字典破解Unix密码。
你可以看看md5crypt.py
。 另外, Windows的crypt
是GnuWin32的一部分。 这是一些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()是密码加密功能。 它基于数据加密标准算法,其中包含了旨在阻止关键字搜索的硬件实现的使用。
键是用户输入的密码。
盐是从组[a-zA-Z0-9./]中选择的两个字符的字符串。 该字符串用于以4096种不同的方式扰乱算法。
通过取密钥的前八个字符中的每一个的最低7位,获得一个56位密钥。 这个56位密钥被用来重复加密一个常量字符串(通常是一个由全零组成的字符串)。 返回值指向加密密码,一系列13个可打印的ASCII字符(前两个字符代表盐本身)。 返回值指向内容被每次调用覆盖的静态数据。
警告:密钥空间由2 ** 56等于7.2e16的可能值组成。 使用大规模并行计算机可以对这个关键空间进行全面的搜索。 诸如破解(1)之类的软件是可用的,其将搜索该密钥空间中人类通常用于密码的部分。 因此,密码的选择至少应该避免常见的词汇和名称。 建议在选择过程中使用passwd(1)程序检查可破解的密码。
DES算法本身有一些怪癖,使得使用crypt()接口对于密码认证以外的任何事情都是一个很差的选择。 如果您计划将crypt()接口用于加密项目,请不要这样做:获得一本关于加密的好书以及一个广泛使用的DES库。