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

时间:2016-01-20 10:41:04

标签: python django tastypie

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

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

5 个答案:

答案 0 :(得分:15)

编辑:对于一种非常安全的生成随机数的方法,你应该使用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

答案 1 :(得分:12)

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

  

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

     

特别是,秘密应优先于随机模块中的默认伪随机数生成器使用,该模块专为建模和模拟而设计,而非安全或加密。

e.g。生成一个16字节的令牌:

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

答案 2 :(得分:0)

添加答案,因为我无法对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)])

答案 3 :(得分:0)

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

 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 

答案 4 :(得分:0)

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

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