werkzeug.security.check_password_hash 耗时太长

werkzeug.security.check_password_hash takes too long

check_password_hash 花费的时间比预期的要长得多。使用 Werkzeug 0.12 和 0.9 进行测试。下面的测试表明检查密码大约需要 2 秒。为什么需要这么长时间?

该项目使用 GAE -google 应用引擎。它部署在GAE上。不确定 GAE 是否有可以覆盖我安装的库的 werkzeug 库。我使用的是 GAE SDK 版本 1.9.50

def verify_password(self, password):
    logging.info(self.password_hash)
    logging.info(str(datetime.now()))
    result = check_password_hash(self.password_hash, password)
    logging.info(str(datetime.now()))
    return result
hash:pbkdf2:sha256:......................................
2017-07-28 13:52:14.904270
2017-07-28 13:52:17.041060

================= 编辑 1 ============ 好的,看来我还没有完全清除我的库文件夹。我已经尝试了多次,从 Werkzeug==0.9.6 升级到 Werkzeug==0.12 解决了这个问题。降级到 0.9.6 returns 问题回来了。

这只解决了我机器上的问题。在 GAE 服务器上,延迟仍然存在。 ================= 编辑 2 ============ 创建非常简约的项目后,我再次测试,在 GAE 上的行为是一样的。然后我看到在我的数据库中有两种类型的密码:一种是 sha1,另一种是 sha256。那些 sha1 也在 GAE 上快速工作。

一开始以为是sha1和sha256的不同导致的问题。但是,影响哈希时间的是创建密码时使用的迭代次数。 http://werkzeug.pocoo.org/docs/0.12/utils/#werkzeug.security.generate_password_hash 在某些时候,默认值从 1000 增加到 50000。

将迭代次数减少回 1000 可以加快散列运算速度,但会降低安全性。

generate_password_hash(password, method='pbkdf2:sha256:1000')

在数据库中我有两种类型的密码,一些是在升级 Werkzeug 之前生成的,一些是在升级之后生成的。

pbkdf2:sha1:1000$.......
pbkdf2:sha256:50000$......

所以第一个和第二个之间的差异是巨大的,因为 1000 对 50000 次迭代。