Python Secret 模块 | 生成安全随机数

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将学习一个有趣的 Python 模块,名为 secrets。我们还将学习它的方法以及它与 random 模块的区别。它在 Python 3.6 中发布,以生成接近真正随机性的数据而闻名。我们将学习如何实现 secrets.SystemRandom() 类和 secret 模块函数。在深入探讨此主题之前,让我们简要介绍一下 secret 模块。

secret 模块介绍

Python secret 模块在 Python 3.6 或更高版本中可用。它用于生成随机数以管理重要数据,例如密码、账户身份验证、安全令牌和相关秘密。我们可以生成加密强大的数据,并且生成的数据可用于 OTP(一次性密码)

以下是一些与标准安全相关的功能的关键用法。

  • 生成随机数。
  • 创建密码和 OTP。
  • 随机令牌
  • 密码恢复安全 URL 和会话密钥。

使用 secret 模块而不是 random 模块的原因

Random 模块也可以生成随机数据,但不是非确定性数据。换句话说,通过找到用于生成数据的种子,可以轻松确定 random 模块生成的数据。它不适合安全目的。另一方面,secrets 模块是生成安全数据的绝佳方式。secrets 模块是一个加密强度高的伪随机数生成器,适用于安全敏感的应用。

现在,让我们学习它的重要方法。

类 secrets.SystemRandom

此类用于使用操作系统提供的最高质量的源来生成安全随机数。它允许我们使用 random 模块的所有功能。random 模块具有相同的类 random.SystemRandom,用于生成加密安全随机数据。

让我们了解如何使用 secrets.SystemRandom 类来保护随机生成器。

示例 -

输出

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 类的一个方法,它从给定的非空序列中返回随机选择的元素。让我们了解下面的示例。

示例 -

在下面的示例中,我们将生成一个八个字符的字母数字密码,其中至少包含一个 lowercase 字符、一个 uppercase 字符和三个数字。

输出

The Random Password is: 7Jfb7er2

方法 randbelow(n)

此函数用于生成从给定范围 0 到 n 的安全整数。这里的 n 是独占的上界。让我们了解下面的示例。

示例 -

输出

13, 13, 1, 9, 6,

方法 randbits(K)

此方法返回一个具有 k 个随机位的安全无符号整数。它用于生成将由 N 个设置位组成的随机位掩码。生成的数字比 randbelow 数字更安全。

它在位范围内生成一个随机整数。

  • 如果 k=4,则无符号整数从 0 到 15。
  • 如果 k=8,则无符号整数从 0 到 255。
  • 如果 k=16,则无符号整数从 0 到 65,535,依此类推。

让我们了解下面的示例。

示例 -

输出

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 个字节的随机字节字符串。如果未提供值,则使用合理的默认值。

示例 -

输出

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 个随机字节。如果未提供值,则使用合理的默认值。让我们了解下面的示例。

示例 -

输出

ef38a198fd6f5b61c3fbe7af84f6e5702a7e76c3ecca5f30008e
2ea433c452ba4a96ddc96be7
  • token_urlsafe([nbytes=None]) - 它返回一个安全的随机 URL 安全文本字符串,包含 n-bytes 个随机字节。有时我们需要一个安全链接来进行某些数据事务或密码重置。我们可以将所需的字节作为属性传递。让我们了解下面的示例。

示例 - 生成包含安全令牌的临时 URL,该 URL 难以猜测。

输出

https://mywebsite.com/reset=w0Ts0Wm6gxg

令牌应使用 32 个字节,以便令牌能够抵抗暴力攻击。我们应该根据需要使用字节大小。secrete 模块提供了 compare_digest(a,b) 函数来降低时间攻击的风险。

secrets 模块的实际应用

让我们创建一个程序,我们在其中生成密码并将创建的密码发送到临时难以猜测的 URL。这样,客户端就可以使用该 URL 重置密码。

示例 -

输出

Secure pswd is:  Tm/|M^6V{>
You can reset your password using Reset URL Link
https://users.com/user/sam/reset=17eCrjnQ6RI05EVZeLSzK9ujuc84PiO1LTd--0BdKW0

解释 -

在上面的代码中,我们生成了一个十个字符的密码,该密码包含至少一个 lowercase 字符、一个数字和一个特殊字符。为此,我们使用了 choice() 方法并将其添加到 pswd 变量中。然后我们生成了临时 URL。

结论

本教程涵盖了 secrets 模块及其多种方法的基本概念。我们还使用 Python 代码实现了这些函数,python secrets 模块可帮助我们生成安全的密码和秘密 URL 或令牌。