web-dev-qa-db-ja.com

python)でソルトを作成する

Pythonでランダムな16文字のベース62ソルトを作成するにはどうすればよいですか?プロトコルに必要ですが、どこから始めればよいのかわかりません。ありがとう。

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

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

これはうまくいくはずです。

30
Utku Zihnioglu

UUIDは使用しないでください。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.
24
yarbelk

古い質問、 秘密 の新しい解決策

import secrets

random_string = secrets.token_hex(8)

16文字のランダムな文字列を生成します

7
Alex

最近では、mksaltモジュールに公式のcryptメソッドがあります。単純な16文字の長さの文字列は提供されませんが、とにかくほとんどのハッシュ関数で必要とされる前に$digit$が追加されます。パスワードをハッシュしている場合、これはおそらくはるかに安全に使用できます。

import crypt
crypt.mksalt(crypt.METHOD_SHA512)

次のような出力を生成します。

$6$wpg9lx1sVFNFSCrP
5
lorenzli
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
Simanas

base64で:

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

これは12文字になります

0
olivecoder