【问题标题】:Whats the simplest and safest method to generate a API KEY and SECRET in Python在 Python 中生成 API KEY 和 SECRET 的最简单和最安全的方法是什么
【发布时间】:2016-04-26 03:54:42
【问题描述】:

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

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

【问题讨论】:

标签: python django tastypie


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢!这是直接从终端调用的版本:python -c 'import secrets; print(secrets.token_urlsafe(16))'
  • 对于通过cmd运行Pawel的代码的Windows用户,如果遇到错误SyntaxError: EOL while scanning string literal,请将单引号替换为双引号
【解决方案2】:

对于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 表示仅由小写字母组成的键等。

tastepie 中还有 Api 身份验证的模型,可能值得一试https://django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication

【讨论】:

  • 不知道为什么这被否决了,os.urandom() 既简单又最安全。
  • 如果您使用的是 Python 3.6+,请向下滚动。 Moby Duck 提出了更简单的解决方案。
【解决方案3】:

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

 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 

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果您想要一个易于使用但高度可定制的密钥生成器,请使用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 库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        相关资源
        最近更新 更多