【发布时间】:2011-07-14 17:13:19
【问题描述】:
如何在 python 中创建一个随机的、16 个字符的 base-62 salt?我需要它作为协议,但我不知道从哪里开始。谢谢。
【问题讨论】:
如何在 python 中创建一个随机的、16 个字符的 base-62 salt?我需要它作为协议,但我不知道从哪里开始。谢谢。
【问题讨论】:
import random
import string
def get_salt(size=16, chars=None):
if not chars:
chars = ''.join(
[string.ascii_uppercase,
string.ascii_lowercase,
string.digits]
)
return ''.join(random.choice(chars) for x in range(size))
【讨论】:
现在crypt 模块中有一个官方的mksalt 方法。
它不会为您提供简单的 16 字符长字符串,而是在大多数散列函数所需的前面添加 $digit$。如果您使用哈希密码,这可能更安全。
import crypt
crypt.mksalt(crypt.METHOD_SHA512)
生成如下输出:
$6$wpg9lx1sVFNFSCrP
【讨论】:
您不应该使用 UUID,它们是唯一的,而不是随机的:Is using a CreateUUID() function as salt a good idea?
你的 salts 应该使用加密安全的随机数,在 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.
【讨论】:
[./a-zA-Z0-9],你的哈希值还可能包含+、= 和\n。
在base64中:
import random, base64, struct
rand_float = random.SystemRandom().random()
salt = base64.b64encode((struct.pack('!d', rand_float)))
这将是 12 个字符
【讨论】:
我有点喜欢:
import md5, uuid
m = md5.md5()
m.update(uuid.uuid4())
print m.digest()[:16]
这将是非常非常随机的。
【讨论】:
m.update(str(uuid.uuid4()))?还有m.hexdigest()[:16]?但是,那不会在base62 中,对吧?
>>> import random
>>> ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> chars=[]
>>> for i in range(16):
chars.append(random.choice(ALPHABET))
>>> "".join(chars)
'wE9mg9pu2KSmp5lh'
这应该可行。
【讨论】:
''.join(random.choice(ALPHABET) for i in range(16))
''.join(chr(random.randint(32,126)) for i in range(16)) 怎么样?