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