如何在 python 中生成 PBKDF2 密码哈希?

问题描述 投票:0回答:1

我正在使用一些软件,将其内部用户数据库存储在 JSON 文件 (users.json) 中,其中每个用户都有一个名为

password
的字段,其中值如下所示:

pbkdf2:10000:f30dd5755d4d172d:e7b2fdda936b4ad5335c3b76c8f3568b0e3b14ce1d9b8ca1e32b7627545d0a3811aa3407a814731b1ee1c86e108c66c1616b1ea2570f7ecf8d04d4f465c33947

我想通过 python 以编程方式修改此

users.json
以重置用户密码,而无需通过此应用程序 UI。

如何生成新密码的

pbkdf2:xxxxxx
字符串?

python pbkdf2
1个回答
0
投票

那个

pbkdf2:10000:f30dd5755d4d172d:e7b2fdda936b4ad5335c3b76c8f3568b0e3b14ce1d9b8ca1e32b7627545d0a3811aa3407a814731b1ee1c86e108c66c1616b1ea2570f7ecf8d04d4f465c33947

遵循格式

pbkdf2:iterations:saltinhexstring:hash64bytesinhexstring

要生成新的

pbkdf2:xxx
,您可以使用自Python 3.4以来内置的hashlib.pbkdf2_hmac

例如,

pbkdf2:10000:f30dd5755d4d172d:e7b2fdda936b4ad5335c3b76c8f3568b0e3b14ce1d9b8ca1e32b7627545d0a3811aa3407a814731b1ee1c86e108c66c1616b1ea2570f7ecf8d04d4f465c33947
似乎是密码
admin
使用
pbkdf2_hmac('sha1',...)

的哈希值

您可以通过

admin
迭代生成密码
f30dd5755d4d172d
和盐
10000
的哈希值,如下所示:

from hashlib import pbkdf2_hmac
iterations = 10000
salt = bytes.fromhex('f30dd5755d4d172d')
passwordtohash = 'admin'
hash = pbkdf2_hmac('sha1',bytes(passwordtohash,'utf-8'), salt, iterations, dklen=64)
print(f"pbkdf2:{iterations}:{salt.hex()}:{hash.hex()}")
# pbkdf2:10000:f30dd5755d4d172d:e7b2fdda936b4ad5335c3b76c8f3568b0e3b14ce1d9b8ca1e32b7627545d0a3811aa3407a814731b1ee1c86e108c66c1616b1ea2570f7ecf8d04d4f465c33947

或者一般来说,一个全新的密码(带有新的随机盐):

from hashlib import pbkdf2_hmac
import os
import random
import string
iterations = 10000
salt = os.urandom(8)
passwordtohash = ''.join(random.choice(string.ascii_uppercase) for _ in range(16))
hash = pbkdf2_hmac('sha1',bytes(passwordtohash,'utf-8'), salt, iterations, dklen=64)
print(f"New password: '{passwordtohash}'")
print(f"pbkdf2:{iterations}:{salt.hex()}:{hash.hex()}")

New password: 'LGVDFKSBEUISDGUM'
pbkdf2:10000:0ef9f6feb244efc1:2e61922d793aca79f5ad326033987d8714779795cc26e99fae2f44014afac4efdbe17e543379afd1d578a16ee3f4476dc4112cf047c908868ed0318cdf248d64
© www.soinside.com 2019 - 2024. All rights reserved.