gpt4 book ai didi

python - 如何在 Python 2 和 Python 3 中生成密码?安全地?

转载 作者:太空狗 更新时间:2023-10-30 02:08:37 27 4
gpt4 key购买 nike

Stackoverflow 上至少有一篇与此主题相关的帖子:Generate password in python

你会发现这个主题甚至在 PEP 中也受到了一些批评。这里提到:https://www.python.org/dev/peps/pep-0506/

那么,如何在Python 2和Python 3中正确安全的生成随 secret 码呢?

最佳答案

python 2

您可能知道,Python 2 中的 random 模块使用不安全的伪随机数生成器。这一点在官方文档页面的警告中有明确说明:“不应出于安全目的使用此模块的伪随机生成器。”

random 模块是不安全的,因为它的内部依赖于主机上当前时间播种的算法(Mersenne Twister 算法)。尽管具有良好的输出统计特性,但此类算法的输出具有高度可预测性,并且容易受到随机数生成器攻击。如果您不相信安全专家的话,请查看这篇热门帖子:https://jazzy.id.au/2010/09/22/cracking_random_number_generators_part_3.html

Python 2官方文档推荐使用os.urandom函数和SystemRandom类,因为它们使用操作系统提供的更安全的随机数源。

操作系统使用来自多个来源的数据生成伪随机数,其中大部分是非常不可预测的并且具有高熵。 Linux 上的 os.urandom 使用 /dev/urandom 设备的输出。您可以查看官方内核文档以了解有关 /dev/urandom 的详细信息以及它与 /dev/random 的区别。另外,如果您使用硬件随机数生成器,是否可以将其用作/dev/random

这个问题在 Python 2 中的答案可能是这样的:

import os

def gen_password(length=8, charset="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"):
random_bytes = os.urandom(length)
len_charset = len(charset)
indices = [int(len_charset * (ord(byte) / 256.0)) for byte in random_bytes]
return "".join([charset[index] for index in indices])

python 3

最新的 Python 3.6 有一个名为 secrets 的模块。它在 corresponding PEP-0506 by Steven D'Aprano 中提出。该模块的目的是提供适用于现代应用程序和“加密天真”用户的“默认安全”加密原语。它还为加密内容提供干净直接的 API。

考虑以下在 Python 3 中生成随 secret 码的实现。

import secrets

def gen_password(length=8, charset="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"):
return "".join([secrets.choice(charset) for _ in range(0, length)])

关于python - 如何在 Python 2 和 Python 3 中生成密码?安全地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969093/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com