Безопасное сохранение токена доступа

Какие меры безопасности следует использовать для обеспечения того, чтобы моя база данных была скомпрометирована, долговечные токены доступа не могли быть украдены?

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

В идеале я хотел бы зашифровать их, но я не уверен в этом, особенно в проекте с открытым исходным кодом.

Я полагаю, что ответ на этот вопрос похож на вопрос о сохранении платежной информации и соответствия PCI, но я также спрашиваю, почему об этом больше не обсуждается? Возможно, я что-то упустил.

Ответ 1

Вы просто хотите проверить токен, предоставленный другими? Если да, относитесь к нему так же, как к паролю. Используйте алгоритм деривации байта, например Функция деривации пароля на основе пароля 2 (PBKDF2) (также описанная в RFC 2898) с 10 000 итераций и сохраните первые 20 байтов или около того. Когда маркер получен. Это практически не обратимо.

Вы хотите представить токен другим для аутентификации? Если это так, это вызов, потому что, если ваше приложение может расшифровать или иным образом получить доступ к токену, то и злоумышленник. Подумайте, Шеннон Максим, злоумышленник знает систему, особенно для проекта с открытым исходным кодом.

В этом случае наилучшим подходом является шифрование токенов с помощью сильного алгоритма (например, AES256), генерация ключей с использованием мощного генератора случайных чисел криптографического стандарта и надежное хранение ключей (ов) в другом месте для данных, например, в файле, защищенном разрешением, за пределами базы данных в приведенном выше примере. Последнее означает, что атаки SQL-инъекции не будут раскрывать ключи.