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

问题描述 投票:0回答:5

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

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

python django tastypie
5个回答
100
投票

如果您使用的是 Python 3.6 或更高版本,则可以使用 secrets 模块:

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

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

例如生成 16 字节令牌:

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

75
投票

对于python3.6+

import secrets

generated_key = secrets.token_urlsafe(length)

对于旧版本的python

对于生成随机数的非常安全的方法,您应该使用 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


4
投票

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

 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 

2
投票

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

您不应该使用 random.choice,因为 random 在加密上不安全。更好的选择是 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)])

1
投票

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

key-generator
pypi 包。

这里是 GitHub 存储库,您可以在其中找到完整的文档。

这是一个例子:

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
库。

© www.soinside.com 2019 - 2024. All rights reserved.