ai
  • index
  • 1.首页
  • 2.介绍
  • 3.架构概览
  • 4.服务器概念
  • 5.客户端概念
  • 6.版本控制
  • 7.连接到远程MCP服务器
  • 8.连接到本地MCP服务器
  • json_rpc
  • 9.构建一个MCP服务器
  • 10.检查员
  • 11.构建一个MCP客户端
  • 14.架构
  • 15.基础协议概述
  • 16.生命周期
  • 17.传输
  • 18.授权
  • 19.安全最佳实践
  • 20.取消
  • 21.Ping
  • 22.进展
  • 23.Roots
  • 24.采样
  • 25.启发
  • 26.服务器特性
  • 27.提示词
  • 28.资源
  • 29.工具
  • 30.完成
  • 31.日志记录
  • 32.分页
  • 33.架构参考
  • URI模板
  • 12.实现
  • http.server
  • 动态客户端注册协议
  • 受保护资源元数据
  • 授权服务器元数据
  • JWKS
  • PKCE
  • PyJWT
  • secrets
  • watchfiles
  • 实现authorization
  • 实现cancel
  • 实现completion
  • 实现logging
  • 实现pagination
  • 实现process
  • 实现transport
  • psutil
  • pytz
  • zoneinfo
  • contextlib
  • Starlette
  • mcp.1.starter
  • mcp.2.Resource
  • mcp.3.structured_output
  • mcp.4.prompts
  • mcp.5.context
  • mcp.6.streamable
  • mcp.7.lowlevel
  • mcp.8.Completion
  • mcp.9.Elicitation
  • mcp.10.oauth
  • mcp.11.integration
  • mcp.12.best
  • mysql-mcp
  • databases
  • uvicorn
  • asynccontextmanager
  • AsyncExitStack
  • streamable
  • aiohttp
  • publish
  • email
  • schedule
  • twine
  • 1.教学文档总览
  • 2.教师使用指南
  • 3.教学系统快速参考
  • 4.新生入门指南
  • 5.学生使用指南
  • 1. secrets
    • 2.1 为什么需要 secrets 模块?
  • 2. 主要功能
    • 2.1 生成随机数
      • 2.1.1 secrets.randbelow(n)
      • 2.1.2 secrets.randbits(k)
    • 2. 生成随机序列
      • 2.1.3 secrets.token_bytes([nbytes=None])
      • 2.1.4 secrets.token_hex([nbytes=None])
      • 2.1.5 secrets.token_urlsafe([nbytes=None])
    • 3. 从序列中随机选择
      • 2.1.6 secrets.choice(sequence)
  • 3. 实际应用示例
    • 3.1 生成临时密码
    • 3.2 生成密码重置令牌
    • 3.3 生成安全的 API 密钥
  • 4. 安全最佳实践
  • 5. 与 random 模块的区别
  • 6. 总结

1. secrets #

secrets 模块是 Python 3.6 引入的用于生成密码学安全随机数的模块,适合用于管理密码、账户认证、安全令牌等敏感数据。相比 random 模块,secrets 模块使用更安全的随机数生成方法。

2.1 为什么需要 secrets 模块? #

random 模块生成的随机数是基于伪随机数生成器(PRNG),虽然看起来随机,但实际上是可预测的。而 secrets 模块使用操作系统提供的真随机数源(如 /dev/urandom 或 CryptGenRandom),适合安全敏感的场景。

2. 主要功能 #

2.1 生成随机数 #

2.1.1 secrets.randbelow(n) #

生成一个小于 n 的随机整数

import secrets

# 生成一个0-9的随机数
num = secrets.randbelow(10)
print(num)  # 输出: 0-9之间的随机数

2.1.2 secrets.randbits(k) #

生成一个 k 位的随机整数

# 生成一个8位的随机数 (0-255)
num = secrets.randbits(8)
print(num)  # 输出: 0-255之间的随机数

2. 生成随机序列 #

2.1.3 secrets.token_bytes([nbytes=None]) #

生成包含 nbytes 个字节的随机字节串

# 生成16个随机字节
token = secrets.token_bytes(16)
print(token)  # 输出类似: b'\x1a\xf3...'

2.1.4 secrets.token_hex([nbytes=None]) #

生成十六进制格式的随机字符串

# 生成16个字节的十六进制字符串(32个字符)
token = secrets.token_hex(16)
print(token)  # 输出类似: '1af3...32位十六进制字符串'

2.1.5 secrets.token_urlsafe([nbytes=None]) #

生成 URL 安全的随机字符串

# 生成16个字节的URL安全字符串
token = secrets.token_urlsafe(16)
print(token)  # 输出类似: 'Drmhze6EPcv0fN_81Bj-nA'

3. 从序列中随机选择 #

2.1.6 secrets.choice(sequence) #

从非空序列中随机选择一个元素

import string

# 生成一个包含大小写字母和数字的8字符密码
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
print(password)  # 输出类似: 'xY7jK9pL'

3. 实际应用示例 #

3.1 生成临时密码 #

import secrets
import string

def generate_temp_password(length=12):
    alphabet = string.ascii_letters + string.digits + '!@#$%^&*'
    while True:
        password = ''.join(secrets.choice(alphabet) for i in range(length))
        # 确保密码包含至少一个小写、大写、数字和特殊字符
        if (any(c.islower() for c in password)
                and any(c.isupper() for c in password)
                and any(c.isdigit() for c in password)
                and any(c in '!@#$%^&*' for c in password)):
            return password

print(generate_temp_password())

3.2 生成密码重置令牌 #

def generate_reset_token():
    return secrets.token_urlsafe(32)

reset_token = generate_reset_token()
print(f"密码重置令牌: {reset_token}")

3.3 生成安全的 API 密钥 #

def generate_api_key():
    return secrets.token_hex(32)

api_key = generate_api_key()
print(f"API密钥: {api_key}")

4. 安全最佳实践 #

  1. 不要使用 random 模块处理安全相关数据:始终使用 secrets 模块
  2. 足够长的令牌:令牌至少应有32字节(256位)的长度
  3. 不要自己实现加密算法:使用标准库或知名第三方库
  4. 安全存储:生成的令牌和密码应安全存储(如哈希加盐存储)

5. 与 random 模块的区别 #

特性 secrets 模块 random 模块
随机数质量 密码学安全 伪随机
适用场景 安全敏感场景 一般随机需求
性能 较慢 较快
随机源 系统真随机源 伪随机算法

6. 总结 #

secrets 模块是 Python 中处理安全敏感随机数生成的首选工具,特别适合:

  • 密码生成
  • 令牌生成
  • 账户验证
  • 任何需要不可预测随机数的安全场景

记住:在涉及安全性的场景中,永远不要使用 random 模块,而应该使用 secrets 模块。

访问验证

请输入访问令牌

Token不正确,请重新输入