Заставить Django.contrib.auth хранить текстовый пароль

У меня есть сайт на основе Django (еще не запущенный, поэтому реальных пользователей нет), использующий простой django.contrib.auth, и я хочу хранить пароли в виде обычного текста, а не хэшей SHA-1 с солью.

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

ПРИМЕЧАНИЕ. Я прекрасно знаю, что это определенно менее безопасно. Нешифрованный текст требуется для выполнения аутентификации типа «запрос-ответ», например CHAP для PPTP VPN, DIGEST-MD5 для IMAP4 и HTTP Digest для файлового хранилища на основе WebDAV. Итак, я обмениваю безопасность на уровне БД на безопасность на уровне соединения.

Конечно, я думаю об обучении и поощрении пользователей использовать сертификаты X.509 (и не иметь никаких паролей), но это не так просто.

Обратимое шифрование (обфускация) паролей и использование некоторых разрешений на уровне столбцов, поэтому пароль будет INSERTable/UPDATEable, но не SELECTable для веб-пользователя (доступен только для некоторых пользовательских функций проверки, таких как SELECT * FROM users WHERE 'somesha1hash' = USER_HMAC(id, 'salt')), поэтому пароли не будут «просто есть" - это хорошая идея, и я попытаюсь это сделать. Предложения по защите открытых текстовых данных приветствуются, но больше всего я хочу услышать, как взломать способ хранения паролей.


person drdaeman    schedule 09.07.2009    source источник
comment
Почему ты бы так поступил? Это небезопасно. Если вы это сделаете, не забудьте предупредить своих пользователей. Я знаю, что не стал бы подписываться на веб-сайт, делающий это добровольно.   -  person Loïc Wolff    schedule 09.07.2009
comment
Я знаю, что это менее безопасно. Открытый текст необходим для выполнения аутентификации типа «запрос-ответ», например CHAP для PPTP VPN и HTTP Digest для хранения личных файлов на основе WebDAV. Итак, я обмениваю безопасность на уровне БД на безопасность на уровне соединения.   -  person drdaeman    schedule 09.07.2009
comment
Тем самым вы делаете еще хуже. Будет скомпрометирован не только доступ к вашему приложению, но и множество других учетных записей, которые могут быть у ваших пользователей. НЕ ДЕЛАЙТЕ ЭТОГО.   -  person Ber    schedule 09.07.2009
comment
Итак, есть предложения по выполнению PPP CHAP или SASL DIGEST-MD5 без известного открытого текста? Конечно, я думаю об обучении и поощрении пользователей использовать сертификаты X.509 (и не иметь никаких паролей), но это не так просто.   -  person drdaeman    schedule 09.07.2009
comment
Если вам нужно пройти аутентификацию на сервере аутентификации другого типа, почему бы не написать собственный сервер аутентификации? Документация Django описывает, как это сделать достаточно хорошо.   -  person Ryan Duffield    schedule 09.07.2009
comment
Нет, веб-сайт Django является основным источником аутентификации. Он обрабатывает регистрацию пользователей и так далее. Я просто хочу, чтобы FreeRADIUS, IMAPd и моя самодельная реализация WebDAV использовали одни и те же учетные записи.   -  person drdaeman    schedule 09.07.2009


Ответы (3)


Существует множество очень хороших сценариев хранения паролей в виде простого текста (детские игровые сайты и т. д.). На самом деле это довольно легко сделать.

В настройках добавьте:

PASSWORD_HASHERS = ('wereallfriendsinunikittyland.PlainTextPassword',)    

Затем создайте файл wereallfriendsinunikittyland.py.

from django.contrib.auth.hashers import BasePasswordHasher

class PlainTextPassword(BasePasswordHasher):
    algorithm = "plain"

    def salt(self):
        return ''

    def encode(self, password, salt):
        assert salt == ''
        return password

    def verify(self, password, encoded):
        return password == encoded

    def safe_summary(self, encoded):
        return OrderedDict([
            (_('algorithm'), self.algorithm),
            (_('hash'), encoded),
        ])
person fmalina    schedule 15.01.2016

В Django это не так сложно: вам просто нужно написать сервер аутентификации, который будет аутентифицировать пользователей по паролю, хранящемуся в открытом виде.

Тем не менее, вы никогда не должны хранить пароли в открытом виде.
Суть в том, что люди склонны использовать один и тот же пароль снова и снова, и поэтому, используя открытый текст на своем сайте, вы ставите своих пользователей в злоумышленник может получить доступ к своему банковскому счету.
Джефф Этвуд написал хороший пост на эту тему, Возможно, вы неправильно храните пароли; Я предлагаю вам прочитать его, потому что он объяснит проблемы с открытым текстом в паролях гораздо лучше, чем я.
По крайней мере, вы должны поощрять своих пользователей использовать пароль, отличный от их «безопасных» паролей; например, вы можете просто генерировать новые случайные пароли, даже если у этого подхода есть свои ограничения.

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

person rob    schedule 09.07.2009
comment
Большое Вам спасибо. Позор мне, я не думал об этом таким образом. - person drdaeman; 09.07.2009

Не делайте этого. Это нарушает основные принципы безопасности. Лучше вообще не иметь пароля, чем делать это.

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

Это очень трудно действительно сделать правильно. Удачи!

person Ber    schedule 09.07.2009
comment
Спасибо за предложение! К сожалению, это требует от пользователя сначала войти на веб-сайт, затем временно хранить где-то ключ расшифровки, чтобы передать его на сервер RADIUS или POP3/IMAPd, и только после этого возможны PPTP-соединения, но только на некоторое время. И пользователям придется помнить два пароля вместо одного. Звучит довольно тяжело. Я, очевидно, подумываю о продвижении аутентификации X.509/TLS, но, к сожалению, многие пользователи слишком привыкли к схеме логин-пароль и просто не могут слишком легко понять концепцию открытого ключа. - person drdaeman; 09.07.2009
comment
@drdaeman, вы уже заставляете своих пользователей запоминать несколько паролей, потому что они не могут повторно использовать тот, который вы храните в открытом виде. - person Kevin; 09.07.2009
comment
иногда нужны открытые пароли. например в авторизации CHAP - person eri; 09.09.2018