【问题标题】:How can I use bcrypt/scrypt on appengine for Python?如何在 appengine for Python 上使用 bcrypt/scrypt?
【发布时间】:2011-10-25 00:38:27
【问题描述】:

我想按照SUAS 的方式为我的应用程序创建一个身份验证系统,除了我想use bcrypt 或scrypt 而不是使用SHA256 来散列密码。不幸的是,python 的 py-bcrypt 和 scrypt 都使用原生 c,GAE 不支持。

有什么办法吗?

【问题讨论】:

  • 什么是“标准的做法”?我没有使用 Google 的系统有很多原因,其中最突出的原因是当您退出我的应用时,您将退出所有其他 Google 服务。
  • 那为什么不使用 OpenID 呢?您的用户可能不想再创建另一个用户帐户。

标签: python google-app-engine authentication encryption


【解决方案1】:

Scrypt 和 BCrypt 都是处理器密集型的(按设计)。正因为如此,我非常怀疑任何纯 python 实现是否足够快以保证安全——也就是说,能够在合理的时间内使用足够数量的轮次进行散列。

我可以亲自证明这一点,我已经尝试过编写纯 Python BCrypt,但它方式太慢而无法使用。另一个答案中提到的纯python bcrypt 实现的文档指出了这个确切的缺陷 - 要小心将其用于实际安全性,它的轮数必须设置得太低。此类实现速度足够快的唯一情况是在 pypy 下,这不是您所面临的情况。


您想要使用的是基于可用哈希原语(如 SHA-2)的东西。这样,即使在 GAE 下,繁重的计算位仍然可以用 C 编写。我会推荐一些基于 PBKDF2 或 SHA-512-Crypt 的东西(注意:这 不是 只是一个普通的 sha512 哈希)。算法的安全性同样好,但纯 python 实现会更有效率,因为它们可以利用 hashlib 来完成繁重的工作。

Passlib 库在这种情况下可能很有用,它包含纯 python 中的 PBKDF2SHA-512-Crypt 的实现。 (免责声明:我是该库的作者)。另一个支持 PBKDF2 的 Python 库是 Cryptacular

【讨论】:

  • 找到另一个具有相同功能且可与 GAE 配合使用的模块:pypi.python.org/pypi/pbkdf2
  • @JustinGoguen:很抱歉这个错误,实际上并没有在 GAE 上做太多测试。该替代方案当然应该有效(我认为这是python的第一个pbkdf2密码哈希)。不过,如果您有时间,如果您可以在 passlib issue tracker 上发布错误和回溯,那就太好了,所以我可以考虑修复它。
  • @NickJohnson:我们不仅需要一个散列函数,还需要一个用 C 和 stdlib 实现的函数(因此 GAE 具有 C 扩展)。潜在的问题是 Python 在大容量位混洗/算术运算方面相对较慢,例如大多数加密(不仅仅是哈希)所需的,因此需要 C 扩展来提高速度。不幸的是,SCrypt 是基于Salsa20 哈希的,并且是一个定制版本,所以我们不能在 GAE 下安装它。此外,SCrypt 需要有效存储和操作 大量 的哈希值,这在 python 下可能会很棘手。
  • @NickJohnson 实际上,SHA256 是 SCrypt 的一小部分:它只在 scrypt() 的开头和结尾被称为 2*p 次......它对成本的贡献可以忽略不计(并且p 通常固定为 1)。而 Salsa 20/8 核心是整个算法的基础,被称为4*N*r*p 次(其中N 通常很大,例如2**12)。同样,SCrypt 需要分配和操作大小为 128*N*r 的字节数组,并对它们执行许多按位运算...... Python 做的事情几乎没有 C 高效。(继续......)
  • @NickJohnson (...continued) 如果 Python 有一种有效的异或字节数组的方法,以及一个基于 C 的 Salsa 20/8 函数,它可能是可能的;但是尽管我尝试了所有方法,但我的 SCrypt 的纯 python implementation 已经卡住了几个数量级太慢了。另一方面,BCrypt 使用固定数量的 32 位整数,大大减少了资源需求,因此它在纯 Python 中的性能优于 SCrypt。但出于类似的原因,要确保安全仍然很慢。
【解决方案2】:

这个 guy 将 py-bcrypt 移植到纯 python,因此您可以在 GAE 上使用它: https://github.com/erlichmen/py-bcrypt

【讨论】:

  • 虽然在技术上是正确的,但在合理的回合数下,它目前实际使用起来很慢。
猜你喜欢
  • 2017-08-22
  • 2011-06-30
  • 1970-01-01
  • 2012-06-13
  • 2012-12-10
  • 1970-01-01
  • 2018-05-28
  • 2012-06-13
  • 2015-05-18
相关资源
最近更新 更多