PythonPasslib:what's best value for";轮数;
从 对于大多数面向公众的服务,在用户开始感到厌烦之前,您通常可以让登录时间超过250ms-400ms <> > <强>登录/注册< /强>中的最好值是什么?如果我们认为对于登录尝试有“强> >数据库< /强”的调用,它使用<强> MangGDB >强>非阻塞调用< /强>。(使用电子邮件,并将其用作PythonPasslib:what's best value for";轮数;,python,encryption,pbkdf2,Python,Encryption,Pbkdf2,从 对于大多数面向公众的服务,在用户开始感到厌烦之前,您通常可以让登录时间超过250ms-400ms > 登录/注册< /强>中的最好值是什么?如果我们认为对于登录尝试有“强> >数据库< /强”的调用,它使用 MangGDB >强>非阻塞调用< /强>。(使用电子邮件,并将其用作\u id,因此默认情况下它是索引的,查询速度很快:0.0029978256226,当然,使用具有3条记录的数据库进行测试。) 现在,如果我使用半值: password = hashh.encrypt("test"
\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秒左右):
是攻击者有50/50机会猜到密码之前的天数days
是攻击者的硬件预算(美元)美元
是用户密码中的平均熵(以位为单位)李>n
2**(32-31)*30000/2000
)才能有50/50的机会破解给定的哈希。我建议你在达成一个你满意的回合/天数权衡之前,先考虑一下价值观
要记住的一些事情:
- 字典攻击的成功率不是线性的,它更多的是“长尾”情况,因此将50/50标记视为半衰期
是关键因素,因为它编码了使用特定技术级别攻击特定算法的成本估算。实际值,31
,衡量攻击者将花费的“每轮美元天数”。相比之下,使用an攻击PBKDF2-HMAC-SHA512的系数更接近2**-31
——更大的数字意味着攻击者的成本更高,每轮的安全性更低,尽管脚本小子通常不会有这样的预算:)46
$ 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