Mar*_*oma 10 python security password-hash hashlib websecurity
的文档hashlib.scrypt
有点短:
hashlib.scrypt(密码, *, 盐, n, r, p, maxmem=0, dklen=64)
该函数提供 RFC 7914 中定义的基于 scrypt 密码的密钥派生函数。
密码和盐必须是类似字节的对象。应用程序和库应将密码限制在合理的长度(例如 1024)。salt 应该是大约 16 或更多字节,来自正确的源,例如 os.urandom()。
n 是 CPU/内存成本因子,r 是块大小,p 并行化因子和 maxmem 限制内存(OpenSSL 1.1.0 默认为 32 MiB)。dklen 是派生密钥的长度。
我发现它n
必须是 2 的幂并且至少是 2。
除此之外,我感觉有点孤独。hashlib.scrypt(b"foo", salt=b"bar", n=2, r=1, p=1)
今天被认为是安全的吗?如何判断采用哪些参数?
我最近正在使用hashlib.scrypt
,我也很困惑所有这些参数的最小值和最大值是什么。您可能已经回答了您的问题,但我想分享我的研究,以防万一您对这些参数仍有一些悬而未决的问题。
正如您之前所说,文档缺乏hashlib.scrypt
可靠的解释,或者这些参数甚至对于Python 3.11
RFC7914 - scrypt 基于密码的密钥派生函数也很详细:
\n\n\nscrypt 参数
\nscrypt 函数有几个参数。密码 P 通常是人工选择的密码。盐通常是唯一且随机生成的 [RFC4086]。参数 r ("blockSize")\n指定块大小。CPU/内存成本参数 N\n("costParameter") 必须大于 1、2 的幂且小于\n2^(128 * r / 8)。并行化参数 p\n("parallelizationParameter") 是小于或等于 ((2^32-1) * 32) / (128 * r) 的正整数。预期输出长度 dkLen 是要导出的密钥的八位位组长度(“keyLength”);它是小于或等于 (2^32 - 1) * 32 的\n正整数。
\nscrypt 用户可以根据可用的内存量和计算能力、内存子系统的延迟带宽积以及所需的并行度来调整参数 N、r 和 p。目前,r=8 和 p=1 似乎能产生良好的\n结果,但随着内存延迟和 CPU 并行性的增加,\nr 和 p 的最佳值可能会增加。另请注意,由于 SMix 的计算是独立的,因此可以使用较大的 p 值来增加 scrypt 的计算成本,而不会增加内存使用量;因此,即使 CPU 能力和内存容量的增长率出现差异,我们也可以预期 scrypt 仍然有用。
\n
我找到了另一个参考资料,其中更详细地解释了这些参数。
\n配置Scrypt
参数为:
参数N
\xe2\x80\x93 迭代次数(影响内存和 CPU 使用率),例如 16384 (2 ** 14) 或 2048 (2 ** 11)
参数R
-块大小(影响内存和CPU使用率),例如8
参数P
\xe2\x80\x93 并行系数(并行运行的线程 - 影响内存、CPU 使用率),通常为 1
参数password
\xe2\x80\x93 输入密码(建议最小长度为 8-10 个字符)。但应使用长且复杂的密码,以避免密码破解攻击。
参数salt
\xe2\x80\x93 安全生成的随机字节(最少 64 位,建议 128 位)
参数derived-key-length(dklen)
- 生成多少字节作为输出,例如 32 字节(256 位)
消息来源指出:
\n\n\n选择参数取决于您想要等待的时间以及您想要达到的安全级别(防止密码破解):
\n交互式登录的示例参数:N=16384,r=8,p=1(RAM = 2 MB)。对于交互式登录,您很可能不想等待超过 0.5 秒,因此计算应该非常慢。同样在服务器端,通常有许多用户可以同时登录,因此缓慢的 Scrypt 计算会减慢整个系统的速度。
\n文件加密的示例参数:N=1048576,r=8,p=1(RAM = 1 GB)。当您加密硬盘时,极少数情况下您会解锁加密数据,通常每天不会超过 2-3 次,因此您可能需要等待 2-3 秒以增加安全性。
\n