📜  Python中生成安全的随机数

📅  最后修改于: 2020-04-16 13:38:48             🧑  作者: Mango

secrets模块用于生成管理重要数据的随机数,例如密码,帐户身份验证,安全令牌以及相关密码,这些密码具有较强的密码强度。该模块负责提供对最安全的随机性源的访问。该模块存在于Python 3.6及更高版本中。

随机数:类secrets.SystemRandom

此类使用os.urandom()函数从操作系统提供的源中生成随机数。
1,secrets.choice(sequence):此函数从非空序列中返回一个随机选择的元素,以管理基本的安全级别。
示例1:生成一个十个字符的字母数字密码。

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

输出:

'tmX47l1uo4'

示例2:生成一个十个字符的字母数字密码,该密码至少包含一个小写字符,至少一个大写字符和至少三位数字。

import secrets
import string
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):
        print(password)
        break

输出:

Tx8LppU05Q

2,secrets.randbelow(n):此函数返回范围为[0,n)的随机整数。

import secrets
passwd = secrets.randbelow(20)
print(passwd)

输出:

2

3,secrets.randbits(k):此函数返回具有k个随机位的int。

import secrets
passwd = secrets.randbits(7)
print(passwd)

输出:

61

生成令牌

该模块提供了几种为应用程序生成安全令牌的函数,例如密码重置,难以猜测的URL等。

  1. secrets.token_bytes([nbytes = None]):此函数负责生成一个随机字节字符串,其中包含nbytes个字节。如果未提供任何值,则使用合理的默认值。
    import secrets
    token1 = secrets.token_bytes()
    token2 = secrets.token_bytes(10)
    print(token1)
    print(token2)

    输出:

    b“ \ x86?\ x85 \ xcf \ x8ek8ud \ x8a \ x92 \ x8b> R \ xc7 \ x89_ \ xc4x \ xce'u] \ x95 \ x0c \ x05 *?HG8 \ xfb"
    b'Dx \ xe8 \ x7f \ xc05 \ xdf \ xe0 \ xf6 \ xe1'

    2,secrets.token_hex([nbytes = None]):此函数负责以十六进制生成一个随机文本字符串,其中包含nbytes个随机字节。如果未提供任何值,则使用合理的默认值。

    import secrets
    token1 = secrets.token_hex(16)
    token2 = secrets.token_hex(9)
    print(token1)
    print(token2)

    输出:

    5d894a501c88fbe735c6ff496a6d3e51
    78baed9057e597dce4

    3,secrets.token_urlsafe([nbytes = None]):此函数负责生成包含nbytes个随机字节的随机URL安全文本字符串。这适用于密码恢复应用程序。
    示例:生成难以猜测的包含安全令牌的临时URL。

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

    输出:

    https://mydomain.com/reset=GbOiFIvhMoqWsfaTQKbj8ydbo8G1lsMx1ECa6SXjb1s

    令牌应使用多少字节?
    令牌的至少32个字节应用于防止暴力攻击。