在 Python 中生成 API KEY 和 SECRET 的最简单和最安全的方法是什么

Whats the simplest and safest method to generate a API KEY and SECRET in Python

我需要生成将存储在 Redis 服务器中的 API 密钥和密钥。生成密钥和机密的最佳方法是什么?

我正在开发一个基于 Django-tastypie 框架的应用程序。

对于python3.6+

import secrets

generated_key = secrets.token_urlsafe(length)

对于旧版本的python

要获得一种非常安全的随机数生成方式,您应该使用 urandom:

from binascii import hexlify

key = hexlify(os.urandom(length))

这将产生字节,如果需要字符串,请调用key.decode()

对于一般non-secure随机字符串,通过更多设置,您可以通过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

添加答案,因为我无法评论 T. Opletals 的答案。

您不应使用 random.choice,因为随机数在密码学上不安全。更好的选择是 random.SystemRandom(),它使用系统随机源,在 linux 上,这将是 urandom。

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

如果您使用的是 Python 3.6 或更高版本,secrets 模块是最佳选择:

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 particular, 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.

例如生成一个 16 字节的令牌:

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

您还可以使用以下模块生成随机字符串

 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 

如果您想要一个易于使用但高度可定制的密钥生成器,请使用 key-generator pypi 包。

Here is the GitHub repo where you can find the complete documentation.

这是一个例子:

from key_generator.key_generator import generate

custom_key = generate(2, ['-', ':'], 3, 10, type_of_value = 'char', capital = 'mix', seed = 17).get_key()
print(custom_key)  # ZLFdHXIUe-ekwJCu

希望这对您有所帮助:)

免责声明:这使用了我制作的 key-generator 库。