我需要生成一个API密钥和Secret,它将存储在Redis服务器中。生成密钥和秘密的最佳方法是什么?
我正在开发一个基于Django-tastypie框架的应用程序。
编辑:为了一种非常安全的方式生成随机数,你应该使用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身份验证的Model,可能值得一试https://django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication
如果您使用的是Python 3.6或更高版本,则可以使用secrets模块:
秘密模块用于生成适用于管理密码,账户认证,安全令牌和相关秘密等数据的加密强随机数。
特别是,秘密应该优先于随机模块中的默认伪随机数生成器使用,该随机模块设计用于建模和模拟,而不是安全性或加密。
例如生成一个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
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)])