我该如何在Python中创建一个由16个随机字符组成的、基于62进制的盐?我需要它来实现某个协议,但不确定从哪里开始。谢谢。
>>> import random
>>> ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> chars=[]
>>> for i in range(16):
chars.append(random.choice(ALPHABET))
>>> "".join(chars)
'wE9mg9pu2KSmp5lh'
这应该可以正常工作。
你不应该使用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.
[./a-zA-Z0-9]
,而你的还会包含 +
、=
和 \n
。 - cdauth现在在crypt
模块中有一个官方的mksalt
方法。它不会给你一个简单的16个字符长的字符串,而是在前面添加了$digit$
,这对于大多数哈希函数来说是必需的。如果您要哈希密码,这可能更安全。
import crypt
crypt.mksalt(crypt.METHOD_SHA512)
生成如下输出:
$6$wpg9lx1sVFNFSCrP
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))
in 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
,对吧? - Utku Zihnioglu
''.join(random.choice(ALPHABET) for i in range(16))
。 - Scott Griffiths''.join(chr(random.randint(32,126)) for i in range(16))
这个怎么样? - d33tahstring.ascii_letters + string.digits
。 - Sam Bull