Создание соли в питоне - PullRequest
       34

Создание соли в питоне

25 голосов
/ 14 марта 2011

Как бы я создал случайную 16-символьную соль base-62 в python? Мне нужно это для протокола, и я не уверен, с чего начать. Спасибо.

Ответы [ 7 ]

30 голосов
/ 14 марта 2011
>>> import random
>>> ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> chars=[]
>>> for i in range(16):
    chars.append(random.choice(ALPHABET))

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

Это должно работать.

24 голосов
/ 04 мая 2012

Вы не должны использовать 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.
7 голосов
/ 13 июня 2018

старый вопрос, новое решение с секретами

import secrets

random_string = secrets.token_hex(8)

даст 16-символьную случайную строку

5 голосов
/ 27 мая 2016

В наши дни в модуле crypt есть официальный метод mksalt.Он не дает простой строки длиной 16 символов, но добавляет $digit$ впереди, что требуется большинству хеш-функций.Если вы хэшируете пароли, это, вероятно, гораздо безопаснее использовать.

import crypt
crypt.mksalt(crypt.METHOD_SHA512)

Генерирует выходные данные, подобные следующим:

$6$wpg9lx1sVFNFSCrP
0 голосов
/ 19 октября 2016
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))
0 голосов
/ 18 февраля 2014

в base64:

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

это будет 12 символов

0 голосов
/ 14 марта 2011

Я вроде как:

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

Это будет очень, очень случайно.

...