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