use*_*897 4 python hash sha512 hashlib python-2.7
运行mkpasswd -m sha-512 -S salt1234 password结果如下:
$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81
Run Code Online (Sandbox Code Playgroud)
我有这段Python代码,我认为会输出相同的,但不是:
import hashlib, base64
print(base64.b64encode(hashlib.sha512('password' + 'salt1234').digest()))
Run Code Online (Sandbox Code Playgroud)
它反而导致:
nOkBUt6l7zlKAfjtk1EfB0TmckXfDiA4FPLcpywOLORZ1PWQK4+PZVEiT4+9rFjqR3xnaruZBiRjDGcDpxxTig==
Run Code Online (Sandbox Code Playgroud)
不确定我做错了什么.
我的另一个问题是,如何告诉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
Run Code Online (Sandbox Code Playgroud)
命令行工具提供的最小轮数为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//
Run Code Online (Sandbox Code Playgroud)
该算法涉及更多,需要您创建多个摘要.您可以crypt()通过该crypt.crypt()函数访问C 函数,并以与mkpasswd命令行相同的方式驱动它.
如果SHA512-crypt方法可用,这取决于您的平台; 该crypt模块的Python 3版本提供了一个crypt.methods列表,告诉您平台支持哪些方法.由于这使用完全相同的库mkpasswd,因此您的操作系统显然支持SHA512-crypt,Python也可以访问.
您需要在salt前添加前缀'$6$以指定不同的方法.您可以通过'rounds=<N>$'在'$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)
Run Code Online (Sandbox Code Playgroud)
然后,它会生成与mkpasswd命令行相同的输出:
>>> sha512_crypt('password', 'salt1234')
'$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81'
>>> sha512_crypt('password', 'salt1234', rounds=1000)
'$6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ//'
Run Code Online (Sandbox Code Playgroud)
您需要使用crypt.crypt:
>>> import crypt
>>> crypt.crypt('password', '$6$' + 'salt1234')
'$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8172 次 |
| 最近记录: |