python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Flask中secret_key设置

Flask中secret_key设置方式解析

作者:追逐此刻

Flask中app.secret_key用于会话加密和CSRF保护,开发环境可用os.urandom(24)生成随机密钥,生产环境需固定强密钥(如环境变量)确保安全,避免硬编码或弱密钥导致的漏洞风险
app.secret_key = os.urandom(24)

在 Flask 中,app.secret_key = os.urandom(24) 这行代码用于生成并设置一个安全的随机密钥(Secret Key),这是 Flask 应用中非常重要的配置之一。

以下是详细解析:

​1. app.secret_key的作用​

​2. os.urandom(24)详解​

功能​:os.urandom(size) 是 Python 的 os 模块提供的函数,用于生成指定长度的加密安全的随机字节串​(基于操作系统提供的随机源,如 /dev/urandom)。

​**参数 24**​:

​3. 为什么需要随机生成?​​

避免硬编码密钥​:直接写入固定字符串(如 "my-secret-key")容易被泄露或猜测。

动态生成​:每次应用重启时生成新密钥(适合开发环境),但生产环境需要固定密钥:

否则重启后会话会失效,用户需要重新登录。

生产环境推荐从环境变量读取固定密钥:

import os
app.secret_key = os.environ.get('FLASK_SECRET_KEY', os.urandom(24))

​4. 生产环境最佳实践​

使用环境变量​:

# 生成一个永久密钥(Linux/Mac)
python -c 'import os; print(os.urandom(24).hex())'
# 输出示例:d3b07384d113edec49eaa6238ad5ff00c74c7d11

然后在部署时设置环境变量:

export FLASK_SECRET_KEY="生成的密钥"

配置文件​:将密钥保存在安全的配置文件中(如 .env),并通过库(如 python-dotenv)加载。

​5. 常见错误​

​**未设置 secret_key**​:会导致 

RuntimeError: The session is unavailable because no secret key was set.

使用弱密钥​:如 "12345" 或空字符串,会大幅降低安全性。

6. 秘钥的作用​

from flask import Flask, request, jsonify, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(24) # 设置一个密钥,用于加密 session 数据
# 模拟用户信息,实际项目中需要替换为真实的用户信息
users = {
'123': 'admin',
'admin': 'admin'
}
# 登录接口
@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    if username in users and users[username] == password:
        session['logged_in'] = True
        return 'Login successful', 200
    else:
        return 'Login failed', 401
# 查询信息接口,需要登录才能访问
@app.route('/get_info')
def get_info():
    if 'logged_in' in session and session['logged_in']:
        # 用户已登录,返回用户信息
        return 'User Info: OK' # 返回用户信息
    else:
        # 用户未登录,返回未授权的状态码
        return 'Unauthorized', 401
if __name__ == '__main__':
    app.run(debug=True)

秘钥主要用于 ​加密会话(Session)数据,具体作用包括:

7. 秘钥的使用场景​

在代码中,秘钥直接影响以下功能:

​​(1)session的读写​

登录时​:session['logged_in'] = True

这段数据会被 Flask 用秘钥签名后加密,存储到客户端的 Cookie 中。

访问 /get_info 时​:if 'logged_in' in session

Flask 会用秘钥验证客户端传来的 Session 数据是否有效,防止伪造。

​​(2) 错误示例​

如果秘钥为空或太简单(如 '123'):

8. 秘钥的最佳实践​

生产环境​:不要使用 os.urandom(24) 动态生成(每次重启服务会变,导致旧 Session 失效)。应该使用固定的强密码(如从环境变量读取):

app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'fallback-strong-key')

复杂度​:至少 24 字节的随机字符(如通过 openssl rand -hex 24 生成)。

保护秘钥​:不要将秘钥硬编码在代码中或上传到版本控制(如 Git)。

9. 测试验证​

你可以尝试以下操作来观察秘钥的作用:

  1. 正常登录​:用 username: adminpassword: admin 访问 /login,会返回一个加密的 Set-Cookie 头。
  2. 篡改 Cookie​:手动修改 Cookie 中的 session 值,服务端会因签名验证失败返回 401
  3. 移除秘钥​:删除 app.secret_key 后,Session 会无法正常工作。

​总结​

如果需要进一步优化安全性,可以结合 Flask 的 SESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLY 等配置增强会话保护。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文