Позвольте мне разделить все и решить подойти к каждой проблеме по отдельности:
Аутентификация
Для аутентификации у baseauth есть преимущество в том, что он является зрелым решением науровень протокола.Это означает, что многие «могут возникнуть позже» проблем уже решены для вас.Например, при использовании BaseAuth пользовательские агенты знают, что пароль является паролем, поэтому они не кэшируют его.
загрузка сервера аутентификации
Если вы передаете токен вПользователь вместо кэширования аутентификации на вашем сервере, вы все равно делаете то же самое: кэширование информации аутентификации.Разница лишь в том, что вы перекладываете ответственность за кеширование на пользователя.Это кажется ненужным трудом для пользователя без каких-либо выгод, поэтому я рекомендую прозрачно обрабатывать это на вашем сервере, как вы предложили.
Безопасность передачи
Если вы можете использоватьSSL-соединение, это все, что нужно, соединение безопасное *.Чтобы предотвратить случайное многократное выполнение, вы можете отфильтровать несколько URL-адресов или попросить пользователей включить в URL случайный компонент («nonce»).
url = username:key@myhost.com/api/call/nonce
Если это невозможно, а передаваемая информация не является секретнойЯ рекомендую защитить запрос с помощью хэша, как вы предложили при использовании токена.Поскольку хеш обеспечивает безопасность, вы можете указать своим пользователям предоставить хеш в качестве пароля baseauth.Для повышения надежности я рекомендую использовать случайную строку вместо метки времени в качестве «одноразового номера» для предотвращения атак воспроизведения (в течение одной секунды могут быть сделаны два допустимых запроса).Вместо того, чтобы предоставлять отдельные поля «общий секретный ключ» и «ключ API», вы можете просто использовать ключ API в качестве общего секретного ключа, а затем использовать соль, которая не изменяется, чтобы предотвратить атаки радужных таблиц.Поле имени пользователя кажется хорошим местом для размещения одноразового номера, поскольку оно является частью аутентификации.Так что теперь у вас есть чистый звонок, подобный этому:
nonce = generate_secure_password(length: 16);
one_time_key = nonce + '-' + sha1(nonce+salt+shared_key);
url = username:one_time_key@myhost.com/api/call
Это правда, что это немного трудоемко.Это потому, что вы не используете решение уровня протокола (например, SSL).Поэтому было бы неплохо предоставить пользователям какой-то SDK, чтобы, по крайней мере, им не пришлось проходить через него самостоятельно.Если вам нужно сделать это таким образом, я нахожу уровень безопасности подходящим (just-right-kill).
Безопасное секретное хранилище
Это зависит от того, кто вы пытаетесьпомешатьЕсли вы запрещаете людям, имеющим доступ к телефону пользователя, использовать вашу службу REST от имени пользователя, было бы неплохо найти какой-нибудь API-интерфейс для ключей в целевой ОС и иметь SDK (или разработчик) для храненияключ там.Если это невозможно, вы можете по крайней мере усложнить получение секрета, зашифровав его и сохранив зашифрованные данные и ключ шифрования в отдельных местах.
Если вы пытаетесь сохранить других поставщиков программного обеспеченияот получения вашего API-ключа для предотвращения развития альтернативных клиентов работает только метод шифрования и хранения почти .Это криптография whitebox, и до настоящего времени никто не придумал действительно безопасного решения проблем этого класса.Самое меньшее, что вы можете сделать, это по-прежнему выдавать по одному ключу для каждого пользователя, чтобы вы могли запретить злоупотребление ключами.
(*) РЕДАКТИРОВАТЬ: SSL-соединений больше не должно бытьсчитается безопасным без дополнительных шагов для проверки их.