web-dev-qa-db-ja.com

PythonでAPI KEYおよびSECRETを生成する最も簡単で安全な方法

Redisサーバーに保存されるAPIキーとシークレットを生成する必要があります。キーとシークレットを生成する最良の方法は何でしょうか?

私はDjango-tastypieフレームワークベースのアプリを開発しています。

20

編集:乱数を生成する非常に安全な方法のために、あなたはurandomを使用する必要があります:

_from binascii import hexlify

key = hexlify(os.urandom(length))
_

これはバイトを生成します。文字列が必要な場合はkey.decode()を呼び出します

python方法:

_import random
import string

def generate_key(length):
    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
_

そして、必要な長さkey = generate_key(40)で呼び出すことができます。
使用するアルファベットを指定できます。たとえば、小文字のみで構成されるキーには_string.ascii_lowercase_のみを使用します。

TastypieにはAPI認証のモデルもあります。チェックする価値があるかもしれません https://Django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication

16
T. Opletal

Python 3.6以降を使用している場合は、 secrets モジュールが最適です。

シークレットモジュールは、パスワード、アカウント認証、セキュリティトークン、関連するシークレットなどのデータを管理するのに適した、暗号学的に強力な乱数を生成するために使用されます。

特に、シークレットは、セキュリティや暗号化ではなく、モデリングとシミュレーション用に設計されたランダムモジュールのデフォルトの疑似乱数ジェネレータよりも優先して使用する必要があります。

例えば16バイトのトークンを生成するには:

>>> import secrets
>>> secrets.token_urlsafe(16)
'zs9XYCbTPKvux46UJckflw'
>>> secrets.token_hex(16)
'6bef18936ac12a9096e9fe7a8fe1f777'
25
Moby Duck

次のモジュールを使用してランダムな文字列を生成することもできます

 1 - os.urandom(64).encode('hex') #from os module
 2 - uuid.uuid4()                 # from uuid module
 3 - get_random_string(length=32) #from Django.utils.crypto
 4 - secrets.token_hex(64)         #from secrets >= python 3.6 

T. Opletalsの回答についてコメントできないため、回答を追加しています。

Randomは暗号的に安全ではないため、random.choiceを使用しないでください。より良いオプションはrandom.SystemRandom()であり、システムのランダム性のソースを使用します。Linuxでは、これは不自然です。

def generate_key(length):
    char_set = string.ascii_letters + string.punctuation                    
    urand = random.SystemRandom()                                           
    return ''.join([urand.choice(char_set) for _ in range(length)])
0
erik-j-d