我该在哪里获取Flask的SECRET_KEY?

116

在尝试设置Flask-Debugtoolbar时,我遇到了以下问题:

"DebugToolBar需要一个SECRET_KEY"。

我该从哪里获取SECRET_KEY


重要提示:您应该生成密钥一次,然后将其复制/粘贴到您的应用程序中或将其存储为环境变量。请勿在应用程序内重新生成密钥,否则每个应用程序实例都会获得一个新值,这可能会在部署到生产环境时引起问题,因为每个应用程序实例都具有不同的“SECRET_KEY”值。 - undefined
7个回答

148

获取密钥的随机字符串:

方法1:使用Python 2/3中的os

>>> import os
>>> os.urandom(12)
'\xf0?a\x9a\\\xff\xd4;\x0c\xcbHi'

方法 2:在 Python 2/3 中使用 uuid

>>> import uuid
>>> uuid.uuid4().hex
'3d6f45a5fc12445dbac2f59c3b6c7cb1'

方法3:使用Python >= 3.6中的secrets模块:

>>> import secrets
>>> secrets.token_urlsafe(16)
'Drmhze6EPcv0fN_81Bj-nA'
>>> secrets.token_hex(16)
'8f42a73054b1749f8f58848be5e6502c'

方法4:使用Python 3中的os

>>> import os
>>> os.urandom(12).hex()
'f3cfe9ed8fae309f02079dbf'

在Flask中设置密钥

方法1:使用app.secret_key

app.secret_key = 'the random string'

方法2:使用app.config

app.config['SECRET_KEY'] = 'the random string'    

方法三: 将其放入您的配置文件中:

SECRET_KEY = 'the random string'

然后从配置文件中加载配置表单:

app.config.from_pyfile('config.py')  # if your config file's name is config.py

我的Flask应用程序的密钥应该是相同的,还是每个用户都应该生成一个新的密钥? - jryan14ify
2
它用于你的应用程序,而不是用户。 - Grey Li

94

为了保持客户端会话的安全,需要使用 秘密密钥。您可以按照以下方式生成一些随机密钥:

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

只需将那个密钥复制粘贴到您的配置文件中即可。

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

请查看Sessions文档。


29
在Python 3中,如果你想要一个普通的字符串(例如,用于存储在JSON文件中),你可以将其转换为十六进制字符串:import os; print(os.urandom(24).hex()) - Daniel Waltrip
4
你能否只写SECRET_KEY = os.urandom(24)?我相信这会每次生成一个新的密钥,但这会有问题吗? - m13op22
6
我的上一个问题在这里得到了回答。 - m13op22
9
对于像我这样真的很懒的人,这里是@Daniel Waltrips的代码行,你可以复制并粘贴到命令行中使用:python -c "import os; print(os.urandom(24).hex())" - erncyp
1
@erncyp 或 python -c "print(__import__('os').urandom(24).hex())" - Xbox One
1
如果应用程序在每次启动时生成新的随机密钥,那么每当您重新启动应用程序或服务器时,每个会话都将被销毁,并且所有客户端都需要重新登录,以防会话中维护了登录状态。 - Gopal Singh Sirvi

15
为了在Flask中使用会话(session),您需要在应用程序设置中设置密钥(secret key)。 密钥是用于加密您的cookies并将它们保存并发送到浏览器的随机密钥。
此错误是由于Flask-Debugtoolbar代码中的这行引起的。
要解决此问题,您只需要在配置文件中设置一个SECRET_KEY即可。
app.config['SECRET_KEY'] = "Your_secret_string"

如果您有配置文件,只需将以下配置添加到其中:

SECRET_KEY = "Your_secret_string"

9

打开Python,在你的电脑上运行以下命令:

import secrets
secret_key = secrets.token_hex(16)
# example output, secret_key = 000d88cd9d90036ebdd237eb6b0db000
app.config['SECRET_KEY'] = secret_key

1
你不应该这样做。这意味着每次重新启动应用程序都会有新的密钥,这将导致 cookie 签名不同,因此会话将无法继续。 - ravenwing

2
以下是一种将Flask的secret_key存储在隐藏文件中而非代码中的方法:
import secrets
from pathlib import Path

from flask import Flask

app = Flask(__name__)

SECRET_FILE_PATH = Path(".flask_secret")
try:
    with SECRET_FILE_PATH.open("r") as secret_file:
        app.secret_key = secret_file.read()
except FileNotFoundError:
    # Let's create a cryptographically secure code in that file
    with SECRET_FILE_PATH.open("w") as secret_file:
        app.secret_key = secrets.token_hex(32)
        secret_file.write(app.secret_key)

将机密信息存储在与版本控制代码分离的地方通常是一个好主意。Git非常擅长不丢失数据,包括秘密密钥和密码 :)


1
根据Flask的文档,您可以使用以下命令生成SECRET_KEY的值:
python -c 'import secrets; print(secrets.token_hex())'

重要的是要记住以下内容:

在发布问题或提交代码时,不要透露秘密密钥。


-2

我建议使用bcrypt哈希和十六进制进行哈希处理。

# IMPORT
from flask_bcrypt import Bcrypt
import secrets

secret_key = secrets.token_hex(16) #Create HEX Key
bcrypt = Bcrypt(app) #Init Bcrypt
secret_key_hash = bcrypt.generate_password_hash(secret_key) #hash the HEX key with Bcrypt
app.config['SECRET_KEY'] = secret_key_hash #setup secret key

# Output like: $2b$12$Y0QMIGwksa5OhtOBF9BczuAJ0hYMUv7esEBgMMdAuJ4V.7stwxT9e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接