在 python 中创建盐

发布于 2024-10-21 11:55:23 字数 66 浏览 3 评论 0原文

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

How would I create a random, 16-character base-62 salt in python? I need it for a protocol and I'm not sure where to start. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

樱&纷飞 2024-10-28 11:55:24

在 base64 中:

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

这将是 12 个字符

in base64:

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

this will be 12 chars

憧憬巴黎街头的黎明 2024-10-28 11:55:24
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))
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))
眼藏柔 2024-10-28 11:55:24

我认为你应该使用“秘密”模块来生成安全随机性 https://docs.python .org/3/library/secrets.html
它是专门为此类工作而设计的

i think you should use 'secrets' module to generate secure randomness https://docs.python.org/3/library/secrets.html
it specifically crafted for this kind of jobs

沉默的熊 2024-10-28 11:55:24

我有点喜欢:

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

这将是非常非常随机的。

I kind of like:

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

That will be very, very random.

浴红衣 2024-10-28 11:55:23
>>> import random
>>> ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> chars=[]
>>> for i in range(16):
    chars.append(random.choice(ALPHABET))

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

这应该有效。

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

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

This should work.

简单爱 2024-10-28 11:55:23

您不应该使用 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.

You shouldn't use UUIDs, they are unique, not random: Is using a CreateUUID() function as salt a good idea?

Your salts should use a cryptographically secure random numbers, in python 2.4+, os.urandom is the source of these (if you have a good timing source).

# for some given b62encode function

salt = b62encode(os.urandom(16))

you could also use a generator from bcrypt or other awesome crypto/hashing library that is well known and vetted by the people much more expert than I am.

import bcrypt
salt = bcrypt.gensalt()
# will be 29 chars you can then encode it however you want.
信仰 2024-10-28 11:55:23

老问题,新的解决方案 secrets

import secrets

random_string = secrets.token_hex(8)

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

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

引用 secrets 页面:

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

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

Old question, new solution with secrets

import secrets

random_string = secrets.token_hex(8)

Will produce a cryptographically strong 16-character random string.

Use this over standard pseudo-random number generators as they are much less secure.

To quote from the secrets page:

The secrets module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.

In particularly, secrets should be used in preference to the default pseudo-random number generator in the random module, which is designed for modelling and simulation, not security or cryptography.

痴骨ら 2024-10-28 11:55:23

如今,crypt 模块中有一个官方的 mksalt 方法。
它不会给你一个简单的 16 个字符长的字符串,而是在前面添加大多数哈希函数所需的 $digit$ 。如果您要对密码进行哈希处理,那么使用这可能会更安全。

import crypt
crypt.mksalt(crypt.METHOD_SHA512)

生成如下输出:

$6$wpg9lx1sVFNFSCrP

These days there is an official mksalt method in the crypt module.
It does not give you a simple 16 char long string but adds $digit$ in front required by most hashing functions anyway. If you are hashing passwords this is probably much safer to use.

import crypt
crypt.mksalt(crypt.METHOD_SHA512)

Generates outputs like the following:

$6$wpg9lx1sVFNFSCrP
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文