python - 我可以使用 python 的随机模块制作一个安全的基于“纯函数”的密码生成器吗?
问题描述
所以我一直在寻找不使用基于服务器的密码管理器(如 LastPass)来管理我的密码的方法,我遇到了https://lesspass.com。根据该网站,该工具为给定的主密码、用户名和网站创建相同的密码。我真的很喜欢这个想法,并决定使用 random 模块在 python 中制作我自己的概念证明。我做了这个简单的功能:
import random
import string
import os
MASTER_PASS=os.environ.get('MASTER_PASS')
def generate(platform, user, length):
random.seed(platform+user+MASTER_PASS)
letters=string.ascii_letters +string.digits + string.punctuation
password=""
for i in range(length):
password+=random.choice(letters)
print(password)
generate("facebook", "xyz.abc", 32)
我认为只要没有人知道我的 MASTER_PASSWORD 就应该足够安全,但我无法摆脱这种愚蠢不安全的感觉。谁能指出这种方法的明显缺陷并提出一些提高鲁棒性的方法?
编辑:
我认为我需要做一些澄清。我想制作一个程序,我可以在其中输入我的平台名称、用户名和主密码来生成密码。此外,每当我输入相同的组合时,我必须获得相同的密码。我实际上是在尝试创建一个不依赖任何服务器来存储我的密码的无保险库密码管理器。
解决方案
该random
模块不是密码安全的。您应该改用该secrets
模块。
特别是,应该优先使用秘密,而不是随机模块中的默认伪随机数生成器,该生成器是为建模和模拟而设计的,而不是安全或密码学。
API 是相同的,因此您的代码可以正常工作。
就方法而言,这几乎就是其他密码生成器的工作方式。请记住密码中实际包含多少熵(取决于length
的总大小letters
)。
推荐阅读
- amazon-web-services - 如何查找 aws 服务标识符列表
- android - 获取 java.lang.VerifyError: Verifier denied class com.google.android.gms.measurement.internal.zzfl
- javascript - 为什么使用 Promise 将结果保存在变量中会产生更好的性能?
- javascript - 使用 express js 和 vuejs 提供不同的本地 json 数据
- c - 进程返回 -1073741819 (0xC0000005)(在一个简单的矩阵中)
- r - 如何将时间数据提供给 h2o?
- c++ - 在 Visual Studio Code 中使用 C++ 进行调试时如何读取输入而不丢失编码?
- nim-lang - 有什么方法可以从同一目录中的其他文件导入本地 proc?
- selenium - 在 selenium webdrievr 中按 ctrl + tab
- javascript - 我的不和谐计数机器人不是逐台服务器而是每台服务器组合