当前位置:  开发笔记 > 编程语言 > 正文

用Python代码编写的SHA 512 crypt输出与mkpasswd不同

如何解决《用Python代码编写的SHA512crypt输出与mkpasswd不同》经验,为你挑选了1个好方法。

运行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函数进行自定义轮次.似乎只需要一个论点.



1> Martijn Piet..:

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//'

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有