2013-10-02 3 views
3

Мне нужно реализовать хранилище паролей в моем приложении GAE/python2.7. Я уже реализовал файлы cookie для авторизации, у меня уже есть учетная запись/модель пользователя, и у меня уже есть аутентификация через сторонних сторон. Теперь мне нужно добавить аутентификацию через пароль (запрос клиента).Рекомендации по хранению паролей в GAE/python

Я хочу, чтобы пароли были надежно сохранены. Я определил пару вариантов (ниже), которые кажутся разумными, но я никогда не применял хранение паролей раньше, поэтому я не знаю, что я не знаю. Я бы предпочел избежать проблемы, чем ждать проблемы.

Мой вопрос: является ли это лучшей практикой для 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, что разве движущуюся цель «последней»)

  2. Использование webapp2_extras.security - аналогичные приведенным выше, но с использованием

    generate_password_hash() #Seems like it only supports md5/sha1 
    check_password_hash() 
    

благодаря

том

ответ

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'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

Где соль должна быть случайная строка хранится в databae вместе с паролем. Это использует sha256, который, кажется, достаточно хорош для этой цели.

Получение хорошего (надежно случайный) SÅLD может быть проблемой, но на более новых версиях GAE вы можете указать PyCrypto зависимость и использования:

from Crypto.Random import get_random_bytes 
+0

вам нужно использовать 'hexlify' делать? Кажется, что вы можете хранить 'dk' в свойстве string. –

Смежные вопросы