hashlib.scrypt的推荐/最小参数是什么?

9

hashlib.scrypt的文档有点简短:

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

该函数定义了RFC 7914中提供的基于scrypt的密码导出函数。

password和salt必须是类似字节的对象。应用程序和库应将password限制为合理的长度(例如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)是否被认为是安全的?我如何判断选择哪些参数?


https://crypto.stackexchange.com/questions/35423/appropriate-scrypt-parameters-when-generating-an-scrypt-hash - youri
1个回答

1
我最近在使用`hashlib.scrypt`时,对于这些参数的最小值和最大值感到困惑。你可能已经回答了你的问题,但我还是想分享一下我的研究,以防你对这些参数还有一些疑问。
正如你之前所说,即使对于Python 3.11,`hashlib.scrypt`的文档也缺乏对这些参数的详细解释。 RFC7914 - 基于密码的密钥派生函数scrypt也缺乏详细信息。
scrypt参数
scrypt函数有几个参数。口令P通常是由用户选择的密码。盐值通常是唯一且随机生成的[RFC4086]。参数r("块大小")指定了块大小。CPU/内存成本参数N("成本参数")必须大于1,是2的幂,并且小于2^(128 * r / 8)。并行化参数p("并行化参数")是一个正整数,小于或等于((2^32-1) * 32) / (128 * r)。预期输出长度dkLen是要派生的密钥的字节长度("密钥长度"),它是一个正整数,小于或等于(2^32 - 1) * 32。
scrypt的用户可以根据可用的内存和计算能力、内存子系统的延迟带宽乘积以及所需的并行性来调整参数N、r和p。目前,r=8和p=1似乎产生了良好的结果,但随着内存延迟和CPU并行性的增加,r和p的最佳值可能会增加。还要注意的是,由于SMix的计算是独立的,可以使用较大的p值来增加scrypt的计算成本,而不会增加内存使用量;因此,即使CPU功率和内存容量的增长速度不同,我们仍然可以期望scrypt保持有用。
我找到了另一个参考资料,它更详细地解释了这些参数。 Scrypt的配置参数如下:
  • 参数N - 迭代次数(影响内存和CPU使用),例如16384(2 ** 14)或2048(2 ** 11)

  • 参数R - 块大小(影响内存和CPU使用),例如8

  • 参数P - 并行因子(并行运行的线程数 - 影响内存和CPU使用),通常为1

  • 参数password - 输入密码(建议最小长度为8-10个字符)。但是为了避免密码破解攻击,您应该使用长且复杂的密码。

  • 参数salt - 安全生成的随机字节(最小64位,推荐128位)

  • 参数derived-key-length(dklen) - 生成的输出字节数,例如32字节(256位)

来源说明:

选择参数取决于您想要等待多长时间以及您希望实现什么级别的安全性(密码破解抵抗能力):
交互式登录的示例参数:N=16384,r=8,p=1(RAM = 2 MB)。对于交互式登录,您很可能不希望等待超过0.5秒,因此计算速度应该非常慢。此外,在服务器端,通常会有许多用户同时登录,因此较慢的Scrypt计算将拖慢整个系统。
文件加密的示例参数:N=1048576,r=8,p=1(RAM = 1 GB)。当您加密硬盘时,您通常每天只会解锁加密数据2-3次,所以您可能希望等待2-3秒以增加安全性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接