在Python中创建盐值

38 投票
8 回答
36784 浏览
提问于 2025-04-16 13:38

我想知道怎么在Python中生成一个随机的、16个字符的base-62盐值。这个盐值是我在一个协议中需要用到的,但我不知道从哪里开始。谢谢。

8 个回答

25

这是一个老问题,但现在有了新的解决办法,使用secrets模块。

import secrets

random_string = secrets.token_hex(8)

这个方法会生成一个强加密的16个字符的随机字符串。

建议使用这个方法,而不是普通的伪随机数生成器,因为后者的安全性要差很多。

引用一下secrets页面上的内容:

secrets模块用于生成强加密的随机数,适合用来管理一些重要的数据,比如密码、账户认证、安全令牌和其他相关的秘密信息。

特别是,建议使用secrets模块,而不是random模块中的默认伪随机数生成器,因为后者是为了建模和模拟而设计的,并不适合安全或加密用途。

35

你不应该使用UUID,因为它们是唯一的,而不是随机的:使用CreateUUID()函数作为盐值是个好主意吗?

你的盐值应该使用加密安全的随机数,在Python 2.4及以上版本中,可以使用os.urandom来生成这些随机数(前提是你有一个好的时间源)。

# for some given b62encode function

salt = b62encode(os.urandom(16))

你也可以使用来自bcrypt的生成器,或者其他一些很棒的加密/哈希库,这些库都经过了比我更专业的人士的验证。

import bcrypt
salt = bcrypt.gensalt()
# will be 29 chars you can then encode it however you want.
35
>>> import random
>>> ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> chars=[]
>>> for i in range(16):
    chars.append(random.choice(ALPHABET))

>>> "".join(chars)
'wE9mg9pu2KSmp5lh'

这个应该可以正常工作。

撰写回答