​secrets --- 生成管理密码的安全随机数​

news/2024/7/5 1:52:48

3.6 新版功能.

源代码: Lib/secrets.py


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

最好用 secrets 替代 random 模块的默认伪随机数生成器,该生成器适用于建模和模拟,不宜用于安全与加密。

参见

PEP 506

随机数

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

class secrets.SystemRandom

用操作系统提供的最高质量源生成随机数的类。详见 random.SystemRandom。

secrets.choice(sequence)

返回一个从非空序列中随机选取的元素。

secrets.randbelow(n)

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

secrets.randbits(k)

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

生成 Token

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

secrets.token_bytes([nbytes=None])

返回含 nbytes 个字节的随机字节字符串。如果未提供 nbytes,或*nbytes* 为 None,则使用合理的默认值。

>>>

>>> token_bytes(16)  
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'

secrets.token_hex([nbytes=None])

返回十六进制随机文本字符串。字符串有 nbytes 个随机字节,每个字节转换为两个十六进制数码。未提供 nbytes 或为 None 时,则使用合理的默认值。

>>>

>>> token_hex(16)  
'f9bf78b9a18ce6d46a0cd2b0b86df9da'

secrets.token_urlsafe([nbytes=None])

返回安全的 URL 随机文本字符串,包含 nbytes 个随机字节。文本用 Base64 编码,平均来说,每个字节对应 1.3 个结果字符。未提供 nbytes 或为 None 时,则使用合理的默认值。

>>>

>>> token_urlsafe(16)  
'Drmhze6EPcv0fN_81Bj-nA'

Token 应当使用多少个字节?

为了在面对 暴力攻击 时保证安全,Token 的随机性必须足够高。随着计算机推衍能力的不断提升,随机性的安全标准也要不断提高。比如 2015 年,32 字节(256 位)的随机性对于 secrets 模块的典型用例就已经足够了。

要自行管理 Token 长度的用户,可以通过为 token_* 函数指定 int 参数显式指定 Token 要使用多大的随机性。该参数以字节数表示随机性大小。

反之,如果未提供参数,或参数为 None,则 token_* 函数将使用合理的默认值。

备注

该默认值随时可能会改变,比如,版本更新的时候。

其他功能

secrets.compare_digest(ab)

如果字符串或 字节类对象 a 与 b 相等则返回 True,否则返回 False,使用“常态化比较”来降低 定时攻击 的风险。 请参阅 hmac.compare_digest() 了解更多细节。

应用技巧与最佳实践

本节展示了一些使用 secrets 管理基本安全级别的应用技巧和最佳实践。

生成长度为八个字符的字母数字密码:

import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

备注

应用程序不可 以可恢复的格式存储密码,无论是纯文本还是加密形式。 它们应当使用高加密强度的单向(不可逆)哈希函数来加盐和生成哈希值。

生成长度为十个字符的字母数字密码,包含至少一个小写字母,至少一个大写字母以及至少三个数字:

import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
    password = ''.join(secrets.choice(alphabet) for i in range(10))
    if (any(c.islower() for c in password)
            and any(c.isupper() for c in password)
            and sum(c.isdigit() for c in password) >= 3):
        break

生成 XKCD 风格的密码串:

import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
    words = [word.strip() for word in f]
    password = ' '.join(secrets.choice(words) for i in range(4))

生成临时密保 URL,包含密码恢复应用的安全 Token:

import secrets
url = 'https://example.com/reset=' + secrets.token_urlsafe()

http://lihuaxi.xjx100.cn/news/1887404.html

相关文章

谈谈Spring框架中的单例bean为什么是线程不安全

目录 线程安全问题 Spring中的Bean线程安全问题 线程安全问题 线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等…

c语言 词法分析器《编译原理》课程设计 文本形式保存

词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等。 (1) 关键字:是由程序语言定义的具有固定意义的标识符。例如begin,end&#xf…

Typescript中Partial数据类型在项目中的实际应用

在TypeScript中&#xff0c;Partial是一个内置的泛型类型&#xff0c;用于将给定的类型T 的所有属性转换为可选属性。换句话说&#xff0c;Partial<T> 可以帮助我们将一个类型中的所有属性变为可选属性&#xff0c;这在某些情况下非常有用。 例如&#xff1a;设有一个接…

MATLAB算法实战应用案例精讲-【图像处理】图像分割(基础篇)(二)

目录 前言 知识储备 MATLAB图像处理相关函数 数字图像处理函数 数字图像增强

谈谈常用的分布式ID的设计方案?

典型回答 首先&#xff0c;我们需要明确通常的分布式ID定义&#xff0c;基本的要求包括&#xff1a; 全局唯一&#xff0c;区别于单点系统的唯一&#xff0c;全局是要求分布式系统内唯一。 有序性&#xff0c;通常都需要保证生成的ID是有序递增的。例如&#xff0c;在数据库存…

HTML---列表.表格.媒体元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.列表 无序列表 HTML中的无序列表&#xff08;Unordered List&#xff09;用于显示一组项目&#xff0c;每个项目之前没有特定的顺序或编号。无序列表使用<ul>标签来定义&#xff0c;每…

Vue3-03-reactive() 响应式基本使用

reactive() 的简介 reactive() 是vue3 中进行响应式状态声明的另一种方式&#xff1b; 但是&#xff0c;它只能声明 【对象类型】的响应式变量&#xff0c;【不支持声明基本数据类型】。reactive() 与 ref() 一样&#xff0c;都是深度响应式的&#xff0c;即对象嵌套属性发生了…

EasyExcel解决文件读写问题,linux服务器没有安装字体支持而导致出现错误

场景&#xff1a; 在使用 easyexcel 进行导出数据时&#xff0c;在 windows和mac 环境中都能正常导出&#xff0c;但在测试环境 linux 服务器上导出报空指针异常&#xff0c;经排查可能是因为 linux 服务器没有安装字体支持而导致报错 java.lang.NullPointerException…