35

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

4

7 回答 7

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

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

这应该有效。

于 2011-03-14T01:57:17.467 回答
33

您不应该使用 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.
于 2012-05-04T09:11:51.040 回答
20

老问题,新的秘密解决方案

import secrets

random_string = secrets.token_hex(8)

将产生一个加密强度高的 16 字符随机字符串。

在标准的伪随机数生成器上使用它,因为它们的安全性要低得多。

引用秘密页面:

secrets 模块用于生成适用于管理数据(例如密码、帐户身份验证、安全令牌和相关机密)的加密强随机数。

特别是,应该优先使用秘密,而不是随机模块中的默认伪随机数生成器,该生成器是为建模和模拟而设计的,而不是安全或密码学。

于 2018-06-13T16:31:43.073 回答
11

这些天在模块中有一个官方mksalt方法。crypt它没有给你一个简单的 16 字符长的字符串,而是$digit$在前面添加了大多数散列函数所需的内容。如果您正在对密码进行哈希处理,这可能更安全。

import crypt
crypt.mksalt(crypt.METHOD_SHA512)

生成如下输出:

$6$wpg9lx1sVFNFSCrP
于 2016-05-27T17:00:07.047 回答
0

在 base64 中:

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

这将是 12 个字符

于 2014-02-18T11:28:15.330 回答
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))
于 2016-10-19T14:14:13.357 回答
-1

我有点喜欢:

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

那将是非常非常随机的。

于 2011-03-14T02:14:21.243 回答