在python中创建一个salt

时间:2011-03-14 01:52:08

标签: python salt base62

如何在python中创建一个随机的,16个字符的base-62 salt?我需要它用于协议,我不知道从哪里开始。感谢。

7 个答案:

答案 0 :(得分:30)

>>> import random
>>> ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> chars=[]
>>> for i in range(16):
    chars.append(random.choice(ALPHABET))

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

这应该有用。

答案 1 :(得分:24)

你不应该使用UUID,它们是唯一的,而不是随机的:Is using a CreateUUID() function as salt a good idea?

你的盐应该使用加密安全的随机数,在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.

答案 2 :(得分:5)

现在mksalt模块中有一个正式的crypt方法。 它不会给你一个简单的16个字符串长的字符串,但是在大多数散列函数所需的前面添加了$digit$。如果您正在使用哈希密码,那么使用它可能会更安全。

import crypt
crypt.mksalt(crypt.METHOD_SHA512)

生成如下输出:

$6$wpg9lx1sVFNFSCrP

答案 3 :(得分:5)

旧问题,secrets

的新解决方案
import secrets

random_string = secrets.token_hex(8)

将生成一个16个字符的随机字符串

答案 4 :(得分:0)

base64中的

import random, base64, struct
rand_float = random.SystemRandom().random()
salt = base64.b64encode((struct.pack('!d', rand_float)))

这将是12个字符

答案 5 :(得分:0)

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))

答案 6 :(得分:-1)

我有点像:

import md5, uuid
m = md5.md5()
m.update(uuid.uuid4())
print m.digest()[:16]

这将是非常非常随机的。