PythonPasslib:what's best value for";轮数;

PythonPasslib:what's best value for";轮数;,python,encryption,pbkdf2,Python,Encryption,Pbkdf2,从 对于大多数面向公众的服务,在用户开始感到厌烦之前,您通常可以让登录时间超过250ms-400ms > 登录/注册< /强>中的最好值是什么?如果我们认为对于登录尝试有“强> >数据库< /强”的调用,它使用 MangGDB >强>非阻塞调用< /强>。(使用电子邮件,并将其用作\u id,因此默认情况下它是索引的,查询速度很快:0.0029978256226,当然,使用具有3条记录的数据库进行测试。) 现在,如果我使用半值: password = hashh.encrypt("test"

对于大多数面向公众的服务,在用户开始感到厌烦之前,您通常可以让登录时间超过250ms-400ms

<> > <强>登录/注册< /强>中的最好值是什么?如果我们认为对于登录尝试有“强> >数据库< /强”的调用,它使用<强> MangGDB >强>非阻塞调用< /强>。(使用电子邮件,并将其用作
\u id
,因此默认情况下它是索引的,查询速度很快:0.0029978256226,当然,使用具有3条记录的数据库进行测试。

现在,如果我使用半值:

password = hashh.encrypt("test", salt_size = 32, rounds = 4000) # returns 0.0720000267029
hashh.verify("test", password) # returns 0.0709998607635
password = hashh.encrypt("test", rounds = 12) # 0.00699996948242 wonderful?
hashh.verify("test", password) # 0.00600004196167
am在Dell XPS 15 i7 2.0 Ghz上使用Windows 7 64位

注意:已安装,当然,直接将其用作默认值(rounds=12)确实很麻烦:

半价:

password = hashh.encrypt("test", salt_size = 32, rounds = 4000) # returns 0.0720000267029
hashh.verify("test", password) # returns 0.0709998607635
password = hashh.encrypt("test", rounds = 12) # 0.00699996948242 wonderful?
hashh.verify("test", password) # 0.00600004196167
使用有利于生产的
pbkdf2_sha512
时,您能给我推荐一个好的舍入值吗?

(这里是passlib开发者)

pbkdf2_sha512所花费的时间量与它的轮数参数成线性比例(
已用时间=轮数*本机速度
)。使用系统的数据,
native_speed=12000/.143=83916迭代/秒
,这意味着您需要大约
83916*.350=29575轮
才能获得约350ms的延迟

对于bcrypt来说,事情有点棘手,因为它所花费的时间与它的rounds参数成对数比例(
eassed\u time=(2**rounds)*native\u speed
)。使用系统的数据,
native_speed=(2**12)/.405=10113迭代/秒
,这意味着您需要大约
log(10113*.350,2)=11.79轮
才能获得约350毫秒的延迟。但由于BCrypt只接受整数舍入参数,因此您需要选择
rounds=11
(~200ms)或
rounds=12
(~400ms)


所有这些都是我希望在未来的passlib版本中修复的。作为一项正在进行的工作,passlib的mercurial repo目前包含一个简单的小脚本,它负责为给定的目标时间选择正确的轮数值。您可以按如下方式直接下载并运行它(运行可能需要20秒左右):

  • days
    是攻击者有50/50机会猜到密码之前的天数
  • 美元
    是攻击者的硬件预算(美元)
  • n
    是用户密码中的平均熵(以位为单位)
回答你的脚本小子问题:如果一个平均密码有32位熵,而攻击者有一个具有良好GPU的$2000系统,那么在30000回合中,他们需要30天(
2**(32-31)*30000/2000
)才能有50/50的机会破解给定的哈希。我建议你在达成一个你满意的回合/天数权衡之前,先考虑一下价值观

要记住的一些事情:

  • 字典攻击的成功率不是线性的,它更多的是“长尾”情况,因此将50/50标记视为半衰期

  • 31
    是关键因素,因为它编码了使用特定技术级别攻击特定算法的成本估算。实际值,
    2**-31
    ,衡量攻击者将花费的“每轮美元天数”。相比之下,使用an攻击PBKDF2-HMAC-SHA512的系数更接近
    46
    ——更大的数字意味着攻击者的成本更高,每轮的安全性更低,尽管脚本小子通常不会有这样的预算:)


首先:感谢您提供了这个漂亮的库,然后:关于安全性,安全应用程序(不是NASA安全应用程序,只是一个避免脚本小子的简单应用程序)的最佳价值(最低值)是什么?很高兴它很有用!回复:安全最低-我试图将我的回复编辑到500个字符,但放弃了,并将其作为我上述答案的补充-我希望不会太长。它本质上是我计划添加到passlib手册(最终)中的一些文本的清理版本。哇!非常感谢。所有这些信息都很有帮助,再次感谢您所做的一切:)在“仔细”阅读了答案之后,我认为对于希望获得安全支持的程序员来说,这将是一个很好的参考。再次感谢:)能否使choose_rounds.py与Python3兼容?:)
$ python choose_rounds.py -h
usage: python choose_rounds.py <hash_name> [<target_in_milliseconds>]

$ python choose_rounds.py pbkdf2_sha512 350
hash............: pbkdf2_sha512
speed...........: 83916 iterations/second
target time.....: 350 ms
target rounds...: 29575  

$ python choose_rounds.py bcrypt 350
hash............: bcrypt
speed...........: 10113 iterations/second
target time.....: 350 ms
target rounds...: 11 (200ms -- 150ms faster than requested)
target rounds...: 12 (400ms -- 50ms slower than requested)
 days * dollars = 2**(n-31) * rounds