Python secrete模块生成安全随机数
在本教程中,我们将学习一个有趣的Python模块,名为 secret。 我们还将学习它的方法以及它与random模块的区别。它在Python 3.6中发布,被广泛认为可以生成接近真正随机性的数据。我们将学习如何实现 secrets.SystemRandom() 类和secret模块函数。在深入探讨这个主题之前,让我们简要介绍一下secret模块。
secrete模块介绍
Python secrete模块在Python 3.6或更高版本中可用。它用于生成随机数,用于管理关键数据,如密码、账户验证、安全令牌和相关的密钥。我们可以生成具有密码学强度的数据,并且所生成的数据可以用于 OTP(一次性密码)。
以下是一些标准安全相关函数的关键用法。
- 生成随机数。
- 创建密码和OTP。
- 随机令牌
- 密码恢复安全URL和会话密钥。
使用secrete模块而不是random模块的原因
随机模块也可以生成随机数据,但不是不确定性数据。换句话说,由随机模块生成的数据很容易通过找到用于生成数据的种子来确定。它不适用于安全目的。另一方面,secrets模块是生成安全数据的绝佳方式。secrete模块是一个 密码学强大的伪随机数发生器 ,在安全敏感应用程序中非常有用。
现在,让我们学习其重要的方法。
secrets.SystemRandom类
该类用于使用操作系统提供的最高质量源生成安全的随机数。它允许我们使用random模块的所有功能。random模块具有相同的类 random.SystemRandom 用于生成密码学安全的随机数据。
让我们了解如何使用secrets.SystemRandom类来保护随机生成器。
示例
import secrets
# Getting systemRandom class instance out of secrets module
generateSecrets= secrets.SystemRandom()
# secure random integer numbers
random_number = generateSecrets.randint(0, 100)
print("Some Random Integers:", random_number)
# secure random integer number within given
random_number2 = generateSecrets.randrange(4, 40, 4)
print("Secure Random Intergers within Given Range:", random_number2)
# Secure Random choice using secrets
number_list = [16, 20, 28, 24, 39, 31, 42, 48, 54, 60]
secure_choice = generateSecrets.choice(number_list)
print("The List of Random Numbers:", secure_choice)
# Secure Random sample
secure_sample = generateSecrets.sample(number_list, 3)
print("Secure Random Sample:", secure_sample)
# Secure Random float number
secure_float = generateSecrets.uniform(2.5, 25.5)
print("Secure Float Number:", secure_float)
输出:
Some Random Integers: 57
Secure Random Intergers within Given Range: 12
The List of Random Numbers: 48
Secure Random Sample: [48, 54, 28]
Secure Float Number: 24.693838143278885
secrets.choice(sequence) 方法
它是 secrets.SystemRandom 类的方法,它从给定的非空序列中返回随机选择的元素。让我们了解下面的示例。
示例
在下面的示例中,我们将生成一个包含至少一个小写字母、至少一个大写字母和至少三个数字的八个字符的密码。
import secrets as sc
import string
sequence = string.ascii_letters + string.digits
while True:
password = ''.join(sc.choice(sequence) for i in range(8))
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("The Random Password is:", password)
break
输出:
The Random Password is: 7Jfb7er2
randbelow(n)方法
此函数用于从给定范围0到n生成安全整数。这里的n是独占上界。让我们理解以下示例。
示例
import secrets
# secure Random integer number
for i in range(5):
print(secrets.randbelow(15), end=', ')
输出:
13, 13, 1, 9, 6,
The randbits(K) 方法
该方法返回一个具有k个随机位的安全的无符号整数。它用于生成一个由N位设置的随机位掩码。生成的数字比randbelow生成的数字更安全。
它在位范围内生成一个随机整数。
- 如果k=4,则无符号整数从0到15。
- 如果k=8,则无符号整数从0到255。
- 如果k=16,则无符号整数从0到65,535,等等。
让我们理解下面的示例。
示例
import secrets
# using 4 bits
print("The 4 bit number:", secrets.randbits(4))
# using 8 bits
print("The 8 bit number:",secrets.randbits(8))
# using 16 bits
print("The 16 bit number:",secrets.randbits(16))
# using 32 bits
print("The 32 bit number:",secrets.randbits(32))
输出:
The 4 bit number: 11
The 8 bit number: 170
The 16 bit number: 38967
The 32 bit number: 1901293963
使用secrets模块生成安全令牌
该模块可用于使用多种方法生成安全令牌。对于应用程序生成重置密码令牌和难以猜测的URL非常有帮助。我们将使用以下函数来生成令牌。
- token_bytes([nbytes=None]) – 它生成包含nbytes个字节的随机字节字符串。如果不提供值,则使用合理的默认值。
示例
import secrets
token1 = secrets.token_bytes()
token2 = secrets.token_bytes(20)
print(token1)
print(token2)
输出:
b'\x07w\xe0b\xd0\xae\xb8k\x91\x95n\xbc\x04X\xbc\x8e\x03\xcd\xc5]&.]\xda\x8b*\x9d\x1d)m\x18['
b'\xfc\xdd\xaa\xe9\x8f\xa3\x96\x81\x84s\xc7\xcbw\xc7\xc05\xbc\xa6J\xbe'
- token_hex([nbytes=None]) – 它生成一个包含nbytes个随机字节的十六进制的随机字符串。如果没有提供值,则使用一个合理的默认值。让我们来了解下面的示例。
示例
import secrets
token1 = secrets.token_hex(26)
token2 = secrets.token_hex(12)
print(token1)
print(token2)
输出:
ef38a198fd6f5b61c3fbe7af84f6e5702a7e76c3ecca5f30008e
2ea433c452ba4a96ddc96be7
- token_urlsafe([nbytes=None]) – 返回一个安全的随机URL安全文本字符串,包含n个字节的随机字节。有时我们需要一个安全的链接来进行一些数据交易或密码重置。我们可以将所需的字节作为属性传递。让我们来看下面的示例。
示例 生成一个包含安全令牌的难以猜测的临时URL。
import secrets
url = 'https://mywebsite.com/reset=' + secrets.token_urlsafe(8)
print(url)
输出:
https://mywebsite.com/reset=w0Ts0Wm6gxg
令牌应该使用32个字节,以防止暴力攻击。我们应该根据我们的要求使用字节大小。secrete模块提供了compare_digest(a,b)函数,以减少时序攻击的风险。
secrets模块的实际实现
让我们创建一个程序,在程序中生成密码,并将创建的密码发送到难以猜测的临时URL,以便客户端可以使用该URL重置密码。
示例
import secrets
import string
stringSource = string.ascii_letters + string.digits + string.punctuation
# Generate Random Lowercase Character
pswd = secrets.choice(string.ascii_lowercase)
# Generate Random Upercase Character
pswd += secrets.choice(string.ascii_uppercase)
# Generate Random Digit
pswd += secrets.choice(string.digits)
# Generate Random Punctuation
pswd += secrets.choice(string.punctuation)
for i in range(6):
pswd += secrets.choice(stringSource)
char_list = list(pswd)
secrets.SystemRandom().shuffle(char_list)
pswd = ''.join(char_list)
print("Secure pswd is ", pswd)
print("You can reset your password using Reset URL Link")
SafeURL = "https://demo.com/user/jhon/reset="
SafeURL += secrets.token_urlsafe(32)
print(SafeURL)
输出:
Secure pswd is: Tm/|M^6V{>
You can reset your password using Reset URL Link
https://users.com/user/sam/reset=17eCrjnQ6RI05EVZeLSzK9ujuc84PiO1LTd--0BdKW0
说明 –
在上述代码中,我们生成了一个由至少一个小写字母,至少一个数字和一个特殊字符组成的十个字符密码。为了做到这一点,我们使用了choice()方法并添加到pswd变量中。然后我们生成了临时URL。
结论
本教程涵盖了secrets模块及其几种方法的基本概念。我们还使用Python代码实现了这些函数,python secrets模块帮助我们生成安全的密码和秘密的URL或令牌。