Flask中secret_key设置方式解析

Written by

in

文章目录
  • ​会话(Session)加密​:Flask 使用 secret_key 对客户端会话(Session)数据进行签名和加密,防止篡改(如用户认证状态、临时数据等)。 ​CSRF 保护​:部分 Flask 扩展(如 Flask-WTF)依赖 secret_key 生成 CSRF 令牌,防止跨站请求伪造攻击。 ​安全签名​:用于其他需要加密签名的场景(如生成安全令牌、URL 签名等)。
  • ​功能​:os.urandom(size) 是 Python 的 os 模块提供的函数,用于生成指定长度的加密安全的随机字节串​(基于操作系统提供的随机源,如 /dev/urandom)。 ​**参数 24**​: 24 字节(即 192 位)的随机数据是一个常见的安全推荐值,足够抵抗暴力.破解。 过短(如 16 字节)可能降低安全性,过长(如 32 字节)则无必要。
  • ​避免硬编码密钥​:直接写入固定字符串(如 "my-secret-key")容易被泄露或猜测。 ​动态生成​:每次应用重启时生成新密钥(适合开发环境),但生产环境需要固定密钥: 否则重启后会话会失效,用户需要重新登录。 生产环境推荐从环境变量读取固定密钥: import os app.secret_key = os.environ.get(‘FLASK_SECRET_KEY’, os.urandom(24))
  • ​使用环境变量​: # 生成一个永久密钥(Linux/Mac) python -c ‘import os; print(os.urandom(24).hex())’ # 输出示例:d3b07384d113edec49eaa6238ad5ff00c74c7d11 然后在部署时设置环境变量: export FLASK_SECRET_KEY=”生成的密钥” ​配置文件​:将密钥保存在安全的配置文件中(如 .env),并通过库(如 python-dotenv)加载。
  • ​**未设置 secret_key**​:会导致  RuntimeError: The session is unavailable because no secret key was set. ​使用弱密钥​:如 "12345" 或空字符串,会大幅降低安全性。
  • 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)数据,具体作用包括: ​会话安全​:Flask 的 Session 默认存储在客户端的 Cookie 中(通过签名后的加密数据)。秘钥用于签名和验证这些数据,防止篡改。 ​防止伪造​:没有秘钥时,攻击者可能伪造 Session 数据(如手动设置 logged_in=True)。秘钥确保只有服务器能生成有效的 Session。 ​依赖的扩展​:如果使用 Flask 的 flash 消息、flask_login 等扩展,它们也需要秘钥来保证安全。
  • 在代码中,秘钥直接影响以下功能:
  • ​生产环境​:不要使用 os.urandom(24) 动态生成(每次重启服务会变,导致旧 Session 失效)。应该使用固定的强密码(如从环境变量读取): app.secret_key = os.environ.get(‘FLASK_SECRET_KEY’, ‘fallback-strong-key’) ​复杂度​:至少 24 字节的随机字符(如通过 openssl rand -hex 24 生成)。 ​保护秘钥​:不要将秘钥硬编码在代码中或上传到版本控制(如 Git)。
  • 你可以尝试以下操作来观察秘钥的作用: ​正常登录​:用 username: admin, password: admin 访问 /login,会返回一个加密的 Set-Cookie 头。 ​篡改 Cookie​:手动修改 Cookie 中的 session 值,服务端会因签名验证失败返回 401。 ​移除秘钥​:删除 app.secret_key 后,Session 会无法正常工作。
  • ​开发环境​:os.urandom(24) 足够便捷。 ​生产环境​:务必使用固定且保密的密钥(通过环境变量或配置管理工具)。 如果需要进一步优化安全性,可以结合 Flask 的 SESSION_COOKIE_SECURE、SESSION_COOKIE_HTTPONLY 等配置增强会话保护。 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: 详解Python的Flask框架中生成SECRET_KEY密钥的方法 python3使用Flask实现api数据接口的示例详解 使用Docker容器化Flask应用的简单示例 Python用Flask和PyMySQL实现MySQL数据库的增删改查API python flask编写一个简易的web端程序(附demo)
  • 目录
    • ​1. app.secret_key的作用​
    • ​2. os.urandom(24)详解​
    • ​3. 为什么需要随机生成?​​
    • ​4. 生产环境最佳实践​
    • ​5. 常见错误​
    • 6. 秘钥的作用​
    • 7. 秘钥的使用场景​
      • ​​(1)session的读写​
      • ​​(2) 错误示例​
    • 8. 秘钥的最佳实践​
      • 9. 测试验证​
        • ​总结​
          app.secret_key = os.urandom(24)

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

          以下是详细解析:

          • 会话(Session)加密​:Flask 使用 secret_key 对客户端会话(Session)数据进行签名和加密,防止篡改(如用户认证状态、临时数据等)。
          • CSRF 保护​:部分 Flask 扩展(如 Flask-WTF)依赖 secret_key 生成 CSRF 令牌,防止跨站请求伪造攻击。
          • 安全签名​:用于其他需要加密签名的场景(如生成安全令牌、URL 签名等)。

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

          ​**参数 24**​:

          • 24 字节(即 192 位)的随机数据是一个常见的安全推荐值,足够抵抗暴力.破解。
          • 过短(如 16 字节)可能降低安全性,过长(如 32 字节)则无必要。

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

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

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

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

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

          使用环境变量​:

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

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

          export FLASK_SECRET_KEY="生成的密钥"

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

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

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

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

          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)数据,具体作用包括:

          • 会话安全​:Flask 的 Session 默认存储在客户端的 Cookie 中(通过签名后的加密数据)。秘钥用于签名和验证这些数据,防止篡改。
          • 防止伪造​:没有秘钥时,攻击者可能伪造 Session 数据(如手动设置 logged_in=True)。秘钥确保只有服务器能生成有效的 Session。
          • 依赖的扩展​:如果使用 Flask 的 flash 消息、flask_login 等扩展,它们也需要秘钥来保证安全。

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

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

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

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

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

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

          • Session 数据可能被破解或篡改。
          • 攻击者可以伪造 Cookie 绕过登录验证。

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

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

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

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

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

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

          • 开发环境​:os.urandom(24) 足够便捷。
          • 生产环境​:务必使用固定且保密的密钥(通过环境变量或配置管理工具)。

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

          以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

          您可能感兴趣的文章:

          • 详解Python的Flask框架中生成SECRET_KEY密钥的方法
          • python3使用Flask实现api数据接口的示例详解
          • 使用Docker容器化Flask应用的简单示例
          • Python用Flask和PyMySQL实现MySQL数据库的增删改查API
          • python flask编写一个简易的web端程序(附demo)

          站内搜索