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