secrets模块

secrets模块介绍:

secrets模块是Python 3.6新增的内置模块,它可以生成用于管理密码、账户验证信息、安全令牌和相关秘密信息等数据的密码强随机数。需要特别声明的是,与random模块中的默认伪随机数生成器相比,我们应该优先使用secrets模块,因为random模块中的默认伪随机数生成器是为建模和模拟而设计的,不是为安全或密码学而设计的。总体来讲,我们可以通过secrets模块完成两种操作:

  • 1)生成安全随机数
  • 2)生成一个笃定长度的随机字符串–可用作令牌和安全URL

secrets模块提供的函数:

下面来看下secrets模块提供的函数:

函数名描述
secrets.choice(sequence)功能与random.choice(seq)相同,从指定的非空序列中随机选择一个元素并返回
secrets.randbelow(n)功能与random.randrange(n)相同,从半开区间[0, n)内随机返回一个整数
secrets.randbits(k)返回一个带有k个随机位的整数
secrets.token_bytes([nbytes=None])返回一个包含nbytes个字节的随机字节串
secrets.token_hex([nbytes=None])返回一个包含nbytes字节的16进制格式的随机文本字符串,每个字节被转成成2个16进制数字,这可以用来生成一个随机密码。
secrets.token_urlsafe([nbytes])返回一个包含nbytes个字节的随机安全URL文本字符串,这可以在提供重置密码的应用中用来生成一个临时的随机令牌
secrets.compare_digest(a, b)比较字符串a和字符串b是否相等,相等则返回True,否则返回False

如果以上函数中的nbytes参数未提供或设置为None则会取一个合理的默认值。那么生成一个令牌(token)时应该使用多个字节呢? 为了抵抗暴力破解攻击,令牌需要有足够的随机性,当生成令牌使用的字节数越多时,暴力破解需要尝试的次数就越多。因此,当计算机的计算能力变得更强时,也就意味着计算可以再更短的时间内完成更多的猜测次数。因此,这里所使用的字节个数不应该是一个固定的值,而是应该随着计算机计算能力的增强而增加。到2015年为止,我们相信32个字节(256bits)的随机性对于secrets模块的典型应用场景来说是足够的了。

secrets模块的最佳实践
实例1: 生成一个由8位数字和字母组成的随机密码

import secrets
import string

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

实例2: 生成一个由10位数字和字母组成的随机密码,要求至少有一个小写字符,至少一个大写字符 和 至少3个数字

import secrets
import string

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

实例3: 生成一个用于找回密码应用场景的、包含一个安全令牌的、很难猜到的临时URL

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

说明: secrets模块是Python 3.6新增的内置模块,尽管官方文档中强调过random模块并不适合用来做安全和加密相关的工作,但是在Python 3.6之前我们还是可以用random模块来模拟secrets模块提供的这些功能的实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值