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