我需要生成一个 API 密钥和密钥,它们将被存储在 Redis 服务器中。生成密钥和密钥的最佳方法是什么?
我正在开发一个基于 Django-tastypie 框架的应用程序。
secrets 模块用于生成适用于管理诸如密码、帐户身份验证、安全令牌和相关机密数据等数据的加密强度随机数。
特别地,应优先使用 secrets 而不是 random 模块中的默认伪随机数生成器。后者旨在用于建模和仿真,而非安全或加密。
例如,要生成一个16字节的令牌:
>>> import secrets
>>> secrets.token_urlsafe(16)
'zs9XYCbTPKvux46UJckflw'
>>> secrets.token_hex(16)
'6bef18936ac12a9096e9fe7a8fe1f777'
python -c 'import secrets; print(secrets.token_urlsafe(16))'
- Paweł MuchaSyntaxError: EOL while scanning string literal
,请将单引号替换为双引号。 - user5305519token_urlsafe
和token_hex
之间的区别有什么建议?每个用例推荐使用哪一个? - lowercase00适用于Python3.6+
import secrets
generated_key = secrets.token_urlsafe(length)
对于旧版本的Python:
要想非常安全地生成随机数,您应该使用urandom:
from binascii import hexlify
key = hexlify(os.urandom(length))
如果需要字节,请使用key.encode()
,如果需要字符串,请调用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
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.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)])
如果您想要一个易于使用但高度可定制的密钥生成器,请使用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
库。
django.utils.crypto
中有get_random_string
函数,参见https://dev59.com/W18e5IYBdhLWcg3wPIeA - Kos