如何在Python的appengine上使用bcrypt/scrypt?

Jus*_*uen 23 python authentication encryption google-app-engine

我想为我的应用程序按照SUAS的方式制作一个身份验证系统,除了使用SHA256进行散列密码,我想使用bcrypt或scrypt.不幸的是python的py-bcrypt和scrypt都使用了本地c,这是GAE不支持的.

有什么方法吗?

Eli*_*ins 24

Scrypt和BCrypt都是处理器密集型(按设计).因此,我非常怀疑任何pure-python实现都足够安全 - 也就是说,能够在合理的时间内使用足够数量的舍入进行哈希.

我个人可以证明这一点,我试着写一个纯Python BCrypt,这是方法是有用的太慢.另一个答案中提到的纯python bcrypt实现的文档注意到这个确切的缺陷 - 要小心使用它来实际安全性,它的轮次必须设置得太低.唯一一次这样的实现足够快的是pypy,这不是你面临的情况.


您想要使用的是基于可用的哈希原语(如SHA-2)的内容.这样,即使在GAE下,重的计算位仍然可以用C写入.我建议你根据PBKDF2或SHA-512加密中的东西(注:这是不是只是一个普通的SHA512哈希值).算法的安全性同样好,但纯python实现将更加高效,因为它们可以利用hashlib来完成繁重的工作.

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

  • 找到另一个具有相同功能并与GAE配合使用的模块:http://pypi.python.org/pypi/pbkdf2 (2认同)
  • @NickJohnson实际上,SHA256是[SCrypt](http://www.tarsnap.com/scrypt/scrypt.pdf)的一小部分:它在scrypt()的开头和结尾只被称为"2*p"次. ..它对成本的贡献可以忽略不计(而且'p`通常固定为1).而Salsa 20/8核心是整个算法的基础,被称为"4*N*r*p"次(其中"N"通常很大,例如"2**12").同样,SCrypt需要在大小上分配和操作字节数组'128*N*r`,并对它们执行许多按位操作...... Python不能像C一样有效._(续......)_ (2认同)
  • @NickJohnson _(...续)_如果Python有一种有效的xor字节数组方式和基于C语言的Salsa 20/8函数,那么它可能是有可能的.尽管我尝试了所有方法,但我的纯python [实现](http://code.google.com/p/passlib/source/browse/passlib/utils/_slow_scrypt.py?name=scrypt-dev) SCrypt已被卡住数量级太慢.另一方面,BCrypt使用固定数量的32位整数,使资源需求大幅减少,因此它在纯Python中的性能优于SCrypt.但出于类似的原因,安全性仍然很慢. (2认同)

Fáb*_*niz 8

这个将py-bcrypt移植到纯python中,所以你可以在GAE上使用它:https: //github.com/erlichmen/py-bcrypt