В RESTful API, который использует аутентификацию S3-style, клиент API подписывает запрос своим секретным ключом с использованием HMAC-SHA1, поэтому секретный ключ никогда не передается над проводом. Затем сервер аутентифицирует клиента, используя этот секретный ключ клиента, чтобы повторить сам процесс подписи и сравнить результат с сигнатурой, переданной клиентом.
Это все хорошо и хорошо, но это означает, что серверу требуется доступ к открытому ключу общего секретариата клиента. Это бросается в глаза всем советам против хранения пользовательских паролей в ясности внутри вашей базы данных. Хранение только соленого хэша пароля не является опцией, насколько я могу сказать, потому что тогда я не могу проверить подпись клиента.
Я должен подчеркнуть, что мой API RESTful и, следовательно, должен быть апатридом: я предпочел бы избежать шага входа до других вызовов API.
Одним из необязательных решений является шифрование всех паролей пользователей с использованием некоторого симметричного ключевого алгоритма. Тем не менее, сервер должен будет хранить ключ для этого шифрования где-то легко доступным, например. внутри исходного кода. Это лучше, чем ничего, но не оптимальное решение (как упоминал в своем ответе @Rook, он нарушает CWE-257).
Другим направлением для решения может быть что-то вокруг асимметричных подписей, но я не могу понять, как применить это к HMAC, и не могу найти статей по этому вопросу.
Я пропустил что-то очевидное здесь? Многие респектабельные провайдеры реализовали такую схему аутентификации - они не могут все нарушать общие принципы безопасности, не так ли? Если нет, есть ли какие-либо рекомендации, которыми вы можете поделиться?