2016-06-21 3 views
7

У меня есть служба, в которой пользователи имеют ключ API. Мне нужно сохранить ключи, чтобы их можно было использовать для проверки запросов API.Сохранение ключей API на сервере

Если я храню ключи в виде открытого текста в моей базе данных, я беспокоюсь о том, что кто-то получает доступ к db, захватывает все ключи apk открытого текста, а затем использует их для олицетворения других (скорее всего, будут большие проблемы если кто-то получил доступ к db, хотя).

Это похоже на хранение пользовательских паролей, где вы просто храните хэш и проверяете с помощью этого - однако большинство API-интерфейсов позволяют просматривать ваши ключи API, а это значит, что их нужно сохранить каким-либо восстанавливаемым способом.

Есть ли наилучшая практика для этого?

Благодаря

ответ

4

угроза, что кто-то получает базу данных и получает ключи означает, что они могут использовать ключи API для доступа к данным в базе данных, которые у них уже есть, так что не выиграть там.

Угроза, что кто-то может получить доступ к базе данных, получить пароли, означает, что они могут повторно использовать эти пароли на других веб-сайтах с тем же именем пользователя, потому что люди склонны повторно использовать свои пароли.

Еще одна причина, заключающаяся в том, что пароли в ясном или легко обратимом состоянии - это кто-то из вашей компании, может завладеть паролями и начать делать плохие вещи, действуя как пользователь. Какой риск вы можете иметь, если ваши ключи API находятся в ясном виде.

Как правило, HMAC является решением для криптографического вычисления безопасного значения из одного секретного ключа и некоторой общественной ценности.

Посмотрите на HMAC. С помощью HMAC вы можете загружать секретный ключ в память с помощью приложения (файл конфигурации, считывать AMAZON KMS, вводить в начало приложения или, тем не менее, вы хотите получить там секретный ключ).

В базе данных хранится токен. Token = UUID() например. Токен должен быть уникальным для пользователя, маркер может быть версией в случае, если вам нужно регенерировать, а токен может быть случайным (например, UUID). Знак не секрет.

Ключ API вычисляется с использованием секретного ключа (SK) и маркер пользователя (UT) следующим образом:

API_SECRET = HMAC(SK, UT) 

Затем распределить эту API_KEY и API_SECRET пользователю, и когда пользователь пытается подключиться, вы можете вычислить API_SECRET:

  1. Получить пользователь запись из базы данных (вы, вероятно, уже просите пользователь предоставить свое имя пользователя)
  2. Вычислить api_secret от UT в базе данных:

    API_SECRET_DB = HMAC (СК, UT)

  3. Сравнить вычисленный API_SECRET_DB к одному представленному в запросе:

    , если (API_SECRET_DB == API_SECRET_FROM_REQUEST) {// пользователь Войти }

Нижняя линия, вы только защитить секретный ключ, а не каждый грех gle credential.

+0

Почему бы не просто использовать секретный ключ сервера для шифрования каждого ключа API? Когда ключ API приходит через запрос, зашифровывает его и сравнивает с сохраненным зашифрованным значением. Расшифруйте сохраненное значение, если необходимо отобразить ключ API. –

+0

HAMC - это одностороннее шифрование, обычно используемое в этих сценариях. Рассмотрите это тип шифрования, за исключением того, что это один из способов, поэтому вы не можете расшифровать данные. – Jonathan

+0

ОП задал вопрос о просмотре ключей API. Для одностороннего хэширования, где вам не нужно восстанавливать оригинал, я бы использовал хэш-пароль, например, bcrypt или scrypt, чтобы вы получили растяжение и соление ключа. –

Смежные вопросы