После прочтения о том, как обеспечить, чтобы токены «помнить меня» были защищены и читали исходный код библиотеки PHP-гейткипера psecio, я придумал следующую стратегию обеспечения безопасности, и я хотел узнайте, будет ли это ужасно неправильно. Я в основном делаю следующие вещи:Стратегия безопасного печенья
- Когда пользователь входит в систему, генерирует криптографически безопасную строку с использованием генератора случайных чисел системы. (random.SystemRandom() в Python) Это генерируется путем выбора случайных символов из выбора всех нижних и верхних букв и цифр ASCII. (
''.join(_random_gen.choice(_random_chars) for i in range(length))
, в соответствии с тем, как Django делает то же самое._random_gen
является защищенным генератором случайных чисел) - Сгенерированный токен вставляется в базу данных RethinkDB вместе с идентификатором пользователя, с которым он идет, и время истечения 1 минуту в будущем. Затем создается значение cookie с использованием уникального идентификатора, который RethinkDB генерирует для идентификации этой записи и маркера хэширования sha256. По существу:
':'.join(unique_id, sha256_crypt.encrypt(token))
. sha256_crypt из библиотеки passlib от Python. - Когда пользователь обращается к странице, для которой требуется, чтобы они вошли в систему, фактическое значение cookie извлекается из базы данных с использованием сохраненного идентификатора. Затем хэшированный файл cookie проверяется против фактического файла cookie с использованием
sha256_crypt.verify
. - Если проверка прошла, и ранее сохраненное значение времени меньше текущего времени, то предыдущая запись в базе данных удаляется и создается новая пара идентификаторов/токенов для хранения в виде файла cookie.
Это хорошая стратегия, или есть очевидный недостаток, который я не вижу?
EDIT: После повторного чтения некоторых сообщений переполнения стека, которые я связал в комментарии, я изменил процесс выше, чтобы база данных хранила хеш-маркер, а фактический токен отправляется обратно в виде файла cookie. (что будет происходить только по https, конечно)
Почему шаг 2 (и половина из 3)? Если у вас есть случайный токен, этого достаточно.Это не станет более случайным или безопасным, хэшируя его произвольными способами. – deceze
Я основываю это на разделе «Упреждающе надежная долгосрочная аутентификация» на странице https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence. См. Раздел «Проблема 2: Временные утечки» чуть выше его для контекста. И раздел «Часть II» http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication – Freezerburn