首页 > 编程语言 >python secrets 模块

python secrets 模块

时间:2024-04-15 10:37:28浏览次数:23  
标签:python random 生成 secrets token 随机 模块 password

secrets 说明

secrets 模块用于生成高度加密的随机数,适于管理密码、账户验证、安全凭据及机密数据。

生成随机数

secrets 模块是操作系统提供的最安全地随机性来源。

choice(sequence)

从非空序列中返回一个安全的随机元素。
import secrets

# 假设我们有一个元素列表
elements = ['apple', 'banana', 'cherry', 'date']

# 使用 secrets.choice 来安全地选择列表中的一个随机元素
secure_random_element = secrets.choice(elements)

print(secure_random_element)

randbelow(n)

返回 [0, n) 范围内的随机整数。
import secrets

# 设定上界
n = 100

# 生成一个从0到99(包括)的随机整数
random_number = secrets.randbelow(n)

print(random_number)

randbits(k)

返回 k 个随机比特位的整数。
import secrets

# 生成一个8比特长度的随机整数
random_bits = secrets.randbits(8)
print("随机比特数:", random_bits)

class secrets.SystemRandom

用操作系统提供的最高质量源生成随机数的类。
类的主要方法:
getrandbits(k):生成一个k比特长度的随机整数。
randrange(start, stop):生成一个介于start到stop之间的随机整数。
import secrets

# 创建SystemRandom实例
sys_random = secrets.SystemRandom()

# 生成一个8比特长度的随机整数
random_bits = sys_random.getrandbits(8)
print("随机比特数:", random_bits)

# 生成一个1到10之间的随机整数
random_int = sys_random.randrange(1, 11)
print("随机整数:", random_int)

生成 Token

secrets 模块提供了生成安全 Token 的函数,适用于密码重置、密保 URL 等应用场景。

token_bytes([nbytes=None])

如果指定了 nbytes, secrets.token_bytes(nbytes) 会返回一个包含 nbytes 个随机字节的 bytes 对象。
如果未提供 nbytes 参数,它会返回一个合适用于安全令牌的默认长度的随机字节序列(通常为 32 个字节)。
import secrets

# 生成默认长度(通常为32个字节)的随机字节序列
random_token = secrets.token_bytes()

print(len(random_token))   # 输出:32
print(random_token) # 输出随机字节序列:b'\x8b\xf9\xfe#J\xffHe\x1a\xc5X\x8d1\x14\xff\x99\xba\n\xef9\x98"\xec\xb7\xbb\xfb\x9d0\x0c\xa6\xe1S'

# 生成指定长度的随机字节序列
specified_length_token = secrets.token_bytes(16)

print(specified_length_token) # 输出随机字节序列:b'\x1d\xce\xfc\x04\xc7FT\xfb\xe6\xa7T\xcb\x90\xa0n\x83'

token_hex([nbytes=None])

如果提供了 nbytes 参数,则会生成长度为 nbytes*2 的十六进制字符串(每个字节转换为两个十六进制字符)。
如果未提供 nbytes 参数,则会生成一个适用于安全令牌的默认长度的十六进制字符串(通常是 32 个字符)。
import secrets

# 生成默认长度(通常为32个字符)的随机十六进制字符串
random_hex_token = secrets.token_hex()

print(random_hex_token)

# 生成指定长度的随机十六进制字符串
specified_length_hex_token = secrets.token_hex(16)

print(specified_length_hex_token)

token_urlsafe([nbytes=None])

返回安全的 URL 随机文本字符串,包含 nbytes 个随机字节。文本用 Base64 编码,平均来说,每个字节对应 1.3 个结果字符。
未提供 nbytes 或为 None 时,它会生成一个适合于安全令牌的默认长度随机 URL 安全字符串。

这个函数生成的返回值是一个只包含 URL 安全字符(字母、数字、下划线和短横线)的字符串。
import secrets

# 生成默认长度的随机 URL 安全字符串
random_urlsafe_token = secrets.token_urlsafe()

print(len(random_urlsafe_token))   # 输出:43
print(random_urlsafe_token)        # 输出:L8kP_F_Er-gLrGO_e_JHZBaZjlqXikrqfZFR-NBUSFI

# 生成指定长度的随机 URL 安全字符串
specified_length_urlsafe_token = secrets.token_urlsafe(16)

print(specified_length_urlsafe_token)  # 输出:CzlTfna4b2MaRPsJWoQQbg

比较操作

compare_digest(ab)

用于比较两个字符串 a 和 b,并且在字符串匹配时具有防止时间侧信道攻击的特性。在密码学和安全相关的场景中,比较两个敏感字符串时,使用 secrets.compare_digest 要优于简单的 == 操作符。

该函数返回一个布尔值,如果 a 和 b 匹配,返回 True,否则返回 False。这种比较在比较时间上更加均匀,不易受到时间侧信道攻击的影响。在比较敏感数据时,尤其是在密码验证或令牌比对时使用这个函数,可以提高系统的安全性。
import secrets

a = "my-secret-token-1"
b = "my-secret-token-2"

result = secrets.compare_digest(a, b)
print(result)  # 如果a和b匹配,结果为True;否则为False

生成系统密码示例

import secrets
import string

# 定义密码长度
password_length = 12

# 定义数字不少于3个
minimum_digits = 3

# 密码安全策略:至少一个小写字母、一个大写字母、一个数字和一个特殊符号
password_complexity = [string.ascii_uppercase, string.ascii_lowercase, string.digits, string.punctuation]

# 生成一个包含所有要求字符的初始密码
initial_password = ''.join(secrets.choice(chars) for chars in password_complexity)

# 增加额外数字字符,直到有至少3个数字
digits_count = sum(c.isdigit() for c in initial_password)
while digits_count < minimum_digits:
    additional_digit = secrets.choice(string.digits)
    initial_password += additional_digit
    digits_count += 1

# 增加额外字符,直到达到密码长度要求
while len(initial_password) < password_length:
    initial_password += secrets.choice(''.join(password_complexity))

# 打乱密码字符的顺序
password_list = list(initial_password)
secrets.SystemRandom().shuffle(password_list)
password = ''.join(password_list)

print("生成的系统密码:", password)  # 输出:生成的系统密码: vO[Qc|*38i82

生成密码重置URL示例

import secrets
import string

# 生成安全令牌,用于密码恢复应用程序
security_token = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(16))

# 构建临时密保URL
temp_url = f"https://example.com/password-recovery?token={security_token}"

print("生成的临时密保URL:", temp_url)

# 输出:生成的临时密保URL: https://example.com/password-recovery?token=Z8eiGfzhCCBQPmIS

参考文档

https://docs.python.org/zh-cn/3.12/library/secrets.html#module-secrets

标签:python,random,生成,secrets,token,随机,模块,password
From: https://www.cnblogs.com/wangguishe/p/18110157

相关文章

  • day01-02_我的Java学习笔记 (IDEA的安装、配置及使用、IDEA常用快捷键、IEDA创建空工
    1.IDEA的安装及配置1.1IDEA的安装具体操作,详见《04、IDEA安装详解.pdf》1.2IDEA主题配置、字体配置1.3IDEA常用快捷键1.4IDEA修改快捷键在IDEA工具中,Ctrl+空格的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中......
  • Python 生成测试数据 - faker 模块
    Python生成测试数据-faker模块摘自:http://notes.zhengxinonly.com/posts/2023-09-04.htmlFaker是一个生成数据的Python库,Faker数据通常用于生成测试数据。初始化操作首先需要安装faker模块pipinstallfakerfaker.Faker()创建并初始化一个伪造的生成器,该伪造器......
  • python使用NVlabs/stylegan3生成图片和视频
    此项目只能随机生成图片,不能以图生图先把源码克隆到本地,https://github.com/NVlabs/stylegan3进入项目文件夹,激活虚拟环境condaenvcreate-fenvironment.ymlcondaactivatestylegan3访问https://pytorch.org/get-started/locally/,根据自己的环境选择在虚拟环境执行pi......
  • Python 超好用的几种 f-string 方式,你都会吗 ?
    Python超好用的几种f-string方式,你都会吗?f-string是Python3.6版本引入的一种字符串格式化方法,它允许我们将变量、表达式直接插入到字符串中。本文将介绍f-string的大部分使用方式,快来检查一下你是否全部都掌握了。基本用法f-string是Python中用于字符串格式化的语......
  • Python里的optparse
    Python里的optparse是一个强大的命令行选项解析库argument--参数在命令行中输入的字符串,并会被shell传给 execl() 或 execv()在Python中,参数将是 sys.argv[1:] 的元素注:sys.argv[0] 是被执行的程序的名称fromoptparseimportOptionParser#定义自己的用......
  • python项目位置迁移后,虚拟环境无法使用
    一、虚拟环境无法使用问题修改虚拟环境目录/pyvenv.cfg文件中的路径修改虚拟环境目录/scripts/activate.bat文件中**VIRTUAL_ENV参数**的值,改为当前虚拟环境的路径。另外,项目路径最好不要带中文,否则会导致虚拟环境无法使用(变成使用环境变量终端python)。来源:https://blog......
  • 苹果(MAC)操作系统(OSX)上设置Python3为Python命令启动的方式
    通过HomeBrew安装的Python启动命令为Python3,pip3HomeBrew安装Python的命令为:brewinstallpython然而,很多脚本里Python的启动命令为Python如何使OSX上的Python3命令通过Python启动呢?1.执行下列命令brewinfopython会得到如下输出信息:==>[email protected]:stable3......
  • JAVA - 模块
    目录模块的概念对模块命名模块化的"Hello,World"程序模块的概念在面向对象编程中,基础的构建要素就是类。类提供了封装,私有特性只能被具有明确访问权限的代码访问,即,只能被其所属类中的方法访问,这使得对访问情况的推断称为可能。如果某个私有变量发生了变化,那么我们就会发现一系......
  • ansible模块 playbook
    推荐原生模块:大部分幂等性,能重复执行。常看所有模块:3k个https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html  找关键字常见重要模块:service selinux hosnamefilecopycronyumscriptshell 使用方式:1、命令行  :ansible all -mshe......
  • day13- 模块和包
    这节我们学习模块和包,这块呢,我们在实际使用的过程中,首先保证自己会用就可以,其次也可以加深对Python代码的理解。1、什么是模块开始之前,那我们思考下,之前学的过变量,函数属于一个模块吗?模块呢,就是Python程序,简单来说,就是一个.py的文件,就是属于一个模块那说明我们之前的函数和变......