使用 Flask 密钥创建过程了解环境变量

Understanding environment variable with Flask secret key-creation process

我正在关注 Mac 使用 Python 2.7 的 Flask 教程,它将引导您构建一个具有用户登录名和密码功能的简单博客。

登录系统基于Flask-Login module

第一步是在应用程序目录中的 config.py 文件中设置密钥,如下所示:

import os
class DevelopmentConfig(object):
    SQLALCHEMY_DATABASE_URI = "postgresql://ubuntu:thinkful@localhost:5432/blogful"
    DEBUG = True
    SECRET_KEY = os.environ.get("BLOGFUL_SECRET_KEY", "")

我知道 SECRET_KEY 用于以加密方式保护应用程序,因为将应用程序的密钥存储在应用程序配置本身中不是一个好主意,对吗?因此,我们使用 os.environ.get 从环境变量中获取密钥。

为了做到这一点,教程说有必要通过以下方式在命令行导出环境变量:

export BLOGFUL_SECRET_KEY="your_secret_key_here"

这设置了一个名为 BLOGFUL_SECRET_KEY 的环境变量——但是使用这个环境变量创建的密钥究竟是如何产生的呢?

直接回答你的两个问题:

  1. 密钥存储在源代码外部,因此它们不会提交到修订控制。
  2. 密钥不是通过导出环境变量创建,也不是使用环境变量中的值创建的。

您可能真正想要的信息:

首先,请记住我不是密码学专家!顺便说一句……

您需要做的是为您的应用程序生成一些具有适当大小和加密安全性的秘密,然后将环境变量设置为该值。

我猜测密钥与您链接到的 Flask-Login 模块的 flask.ext.login.make_secure_token 方法有关。如果是这种情况,请查看源代码,密钥将与 HMAC 一起用于 SHA-512。理想情况下,密钥应与算法使用的块大小相同,在这种情况下,如 Python 2.7 hmac implementation 的来源所示,对于 512 位 HMAC 是 64。如果密钥小于块大小,它将用零填充;如果更大,它将散列到块大小。

Flask quickstart documentation section for sessions provides an example backed up by Python's os.urandom documentation 用于生成密码学上合适的随机字节以用于密钥。我会更改他们的示例,因为我们希望块大小为 64(而不是 24)的密钥为:

import os
os.urandom(64)

获取结果并将环境变量设置为该值。直接使用 Flask 示例(不要在您的代码中使用这些值):

>>> import os
>>> os.urandom(24)
'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'

您将获取输出,并将环境变量设置为该值:

export BLOGFUL_SECRET_KEY='\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'

没意识到设置密钥的实际命令是:

export BLOGFUL_SECRET_KEY="your_secret_key_here"

并且可以使用 Python 解释器通过类似这样的方式生成密钥:

>>> import os
>>> os.urandom(24)
'\x072\xe7E|ns\x18g\x80& \xa3\xbf\xed\x91\xe6\x08+\x88\xd6\xafe['