运行mkpasswd -m sha-512 -S salt1234 password
结果如下:
$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81
我有这段Python代码,我认为会输出相同的,但不是:
import hashlib, base64 print(base64.b64encode(hashlib.sha512('password' + 'salt1234').digest()))
它反而导致:
nOkBUt6l7zlKAfjtk1EfB0TmckXfDiA4FPLcpywOLORZ1PWQK4+PZVEiT4+9rFjqR3xnaruZBiRjDGcDpxxTig==
不确定我做错了什么.
我的另一个问题是,如何告诉sha512函数进行自定义轮次.似乎只需要一个论点.
mkpasswd
是前端到crypt()
功能.我不认为这是一个直接的SHA512哈希.
有一点研究指出SHA256-crypt和SHA512-crypt的规范,它表明哈希默认应用了5000次.您可以使用-R
切换指定不同数量的轮次mkpasswd
; -R 5000
确实给你相同的输出:
$ mkpasswd -m sha-512 -S salt1234 -R 5000 password $6$rounds=5000$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81
命令行工具提供的最小轮数为1000:
$ mkpasswd -m sha-512 -S salt1234 -R 999 password $6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ// $ mkpasswd -m sha-512 -S salt1234 -R 1 password $6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ//
该算法涉及更多,需要您创建多个摘要.您可以crypt()
通过该crypt.crypt()
函数访问C 函数,并以与mkpasswd
命令行相同的方式驱动它.
如果SHA512-crypt
方法可用,这取决于您的平台; 该crypt
模块的Python 3版本提供了一个crypt.methods
列表,告诉您平台支持哪些方法.由于这使用完全相同的库mkpasswd
,因此您的操作系统显然支持SHA512-crypt
,Python也可以访问.
您需要在salt前添加前缀'$6$
以指定不同的方法.您可以通过'rounds=
在'$6$'
字符串和salt 之间添加字符串来指定轮数:
import crypt import os import string try: # 3.6 or above from secrets import choice as randchoice except ImportError: from random import SystemRandom randchoice = SystemRandom().choice def sha512_crypt(password, salt=None, rounds=None): if salt is None: salt = ''.join([randchoice(string.ascii_letters + string.digits) for _ in range(8)]) prefix = '$6$' if rounds is not None: rounds = max(1000, min(999999999, rounds or 5000)) prefix += 'rounds={0}$'.format(rounds) return crypt.crypt(password, prefix + salt)
然后,它会生成与mkpasswd
命令行相同的输出:
>>> sha512_crypt('password', 'salt1234') '$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81' >>> sha512_crypt('password', 'salt1234', rounds=1000) '$6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ//'