Python secrete模块生成安全随机数

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或令牌。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程