Я понимаю, что OAuth spec не указывает ничего о происхождении ConsumerKey, ConsumerSecret, AccessToken, RequestToken, TokenSecret или Verifier кода, но мне любопытно, есть ли какие-либо рекомендации по созданию значительно безопасных токенов (особенно комбинации Token/Secret).
Как я вижу, существует несколько подходов к созданию токенов:
- Просто используйте случайные байты, хранящиеся в БД, связанные с пользователем/пользователем
- Хешировать некоторые пользовательские/потребительские данные, хранить в БД, связанные с потребителем/пользователем
- Шифровать данные пользователя/потребителя
Преимущества (1) - база данных является единственным источником информации, которая кажется наиболее безопасной. Было бы сложнее атаковать против (2) или (3).
Хеширование реальных данных (2) позволило бы повторно генерировать токен из предположительно уже известных данных. Не может быть никаких преимуществ для (1), поскольку в любом случае вам нужно будет хранить/искать. Больше ЦП, чем (1).
Шифрование реальных данных (3) позволит расшифровать информацию. Это потребует меньшего количества хранилищ и потенциально меньшего количества поисковых запросов, чем (1) и (2), но потенциально менее безопасных.
Существуют ли какие-либо другие подходы/преимущества/недостатки, которые следует учитывать?
EDIT: другое соображение состоит в том, что в токенах ДОЛЖНО быть какое-то случайное значение, поскольку должна существовать возможность истечения срока действия и переиздание новых токенов, поэтому он должен состоять не только из реальных данных.
Follow On Questions:
Существует ли минимальная длина токена для криптографической защиты? Насколько я понимаю, более длинные тайники Token Secrets создадут более безопасные подписи. Правильно ли это понимание?
Есть ли преимущества использования конкретной кодировки над другой с точки зрения хэширования? Например, я вижу много API, использующих шестнадцатеричные кодировки (например, строки GUID). В алгоритме подписи OAuth токен используется как строка. С шестнадцатеричной строкой доступный набор символов будет намного меньше (более предсказуемым), чем при использовании кодировки Base64. Мне кажется, что для двух строк одинаковой длины один с большим набором символов будет иметь лучшее/более широкое распределение хеширования. Мне кажется, что это улучшит безопасность. Правильно ли это предположение?
Спецификация OAuth поднимает эту проблему в 11.10 Энтропия секретов.