在GAE / python中存储密码的最佳实践

时间:2013-10-02 22:22:32

标签: django security google-app-engine webapp2

我需要在我的GAE / python2.7应用程序中实现密码存储。我已经实现了授权cookie,我已经有了帐户/用户模型,而且我已经通过第三方进行了身份验证。现在我需要通过密码添加身份验证(客户请求)。

我希望密码安全存储。我已经确定了几个选项(下面),这看起来很明智,但我以前从未实现过密码存储,所以我不知道我不知道的。我宁愿避免问题而不是等待问题。

我的问题是:这是GAE的最佳实践吗?如果没有,那是什么?

请注意,我只是在寻找一种在存储之前散列密码的方法,并进行比较。我不需要全栈用户模块。

我已经审核过previous question这有用,但并没有直接解决我的问题。

选项:

  1. 使用Django。像

    这样的东西
    import django.contrib.auth.hashers as foo
    to_store_in_db = foo.make_password(conforming_password)
    
    # later
    
    passes = foo.check_password(entered_password, password_from_db)
    

    (我们目前在我们的应用程序中不使用Django,因此我们可以使用我们喜欢的任何一种,但我建议使用1.4,因为它是GAE中最新的,不是'最新'的移动目标)

    < / LI>
  2. 使用webapp2_extras.security - 与上述类似,但使用

    generate_password_hash() #Seems like it only supports md5/sha1
    check_password_hash()
    
  3. 感谢

    汤姆

1 个答案:

答案 0 :(得分:2)

只有一个内置函数:https://docs.python.org/2/library/hashlib.html#key-derivation-function

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)

B&#39; 0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5&#39;

其中salt应该是密码存储在数据库中的随机字符串。这使用sha256,这似乎足以达到此目的。

获得良好(安全随机)sald可能是一个问题,但在较新版本的GAE中,您可以指定pycrypto依赖项,并使用:

from Crypto.Random import get_random_bytes