Python 快速单向安全散列算法

Python 快速单向安全散列算法,python,security,hash,cryptography,passlib,Python,Security,Hash,Cryptography,Passlib,我一直在研究现有的散列算法,为一个使用基本身份验证的小型微服务散列密码 根据社区标准,我选择bcrypt-algo来散列密码。但是在使用Apache基准测试服务器之后,我发现90%的cpu周期都花在验证密码上。为了提供一个上下文,t3.large能够在没有身份验证的情况下处理60个请求/秒,而在有身份验证逻辑的情况下只能处理6个请求/秒 我考虑过使用python中可用的passlib库进行基准测试,下面是使用默认设置的passlib进行100次迭代的结果- print (timeit.timei

我一直在研究现有的散列算法,为一个使用基本身份验证的小型微服务散列密码

根据社区标准,我选择bcrypt-algo来散列密码。但是在使用Apache基准测试服务器之后,我发现90%的cpu周期都花在验证密码上。为了提供一个上下文,t3.large能够在没有身份验证的情况下处理60个请求/秒,而在有身份验证逻辑的情况下只能处理6个请求/秒

我考虑过使用python中可用的passlib库进行基准测试,下面是使用默认设置的passlib进行100次迭代的结果-

print (timeit.timeit('my_ctx.verify("password", hash_sha256)', setup=setup, number=100))
40.74972726893611
print (timeit.timeit('my_ctx.verify("password", hash_md5)', setup=setup, number=100))
0.03434068092610687
print (timeit.timeit('my_ctx.verify("password", hash_des)', setup=setup, number=100))
0.01271090202499181
print (timeit.timeit('my_ctx.verify("password", hash_bcrypt)', setup=setup, number=100))
25.593560334993526
print (timeit.timeit('my_ctx.verify("password", hash_sha512)', setup=setup, number=100))
46.78381339798216
print (timeit.timeit('my_ctx.verify("password", hash_pbkdf2)', setup=setup, number=100))
2.236785114975646
print (timeit.timeit('my_ctx.verify("password", hash_argon2)', setup=setup, number=100))
12.668332702014595
据我所知,有多个回合在幕后进行。 将sha256的轮次改为1000次后,有显著差异-

timeit.timeit('sha256_crypt.hash("password", rounds=1000)', setup=setup, number=100)
所以我的问题是-


对于一个使用基本身份验证而不是基于令牌的身份验证或任何其他方式的小型微服务,我想问一下采取什么样的最佳方法,以便密码安全地驻留在托管在amazon服务器上的多级安全数据库中?

密码哈希非常缓慢,这是故意的。这就是真正提供安全性的原因,因为它实际上可以防止对密码的暴力攻击。您需要为服务器拨出适当的成本参数,但要让它们尽可能昂贵。尽管如此,登录应该是每个会话操作一次,但您不应该对每个请求都执行此哈希验证。“那么,您将需要一种不同的身份验证机制。”deceze同意您的两条意见。但是,如果我被限制使用基本的auth验证,并且希望在api上也有最佳的性能,那么在可用资源有限的情况下,算法的最佳选择是什么呢?如果我在sha256 algo上设置1000发子弹,可以吗?这够好吗?你的极限是什么?“仅限于基本授权”的确切含义是什么?你为什么只限于此?你能改用签名算法吗?这基本上与basic auth类似,因为您只需要在
Authorization
头中发送一个值,但与发送普通密码不同……每个请求都需要用户名和密码保护的api。