Подтвердить что ты не робот

Лучший способ генерации ключа API

Таким образом, с множеством различных сервисов, теперь API Google, API Twitter, API Facebook и т.д. и т.д.

Каждая служба имеет ключ API, например:

AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q

Все ключи различаются по длине и содержащимся в них символам, мне интересно, какой лучший подход для создания ключа API?

Я не прошу указать конкретный язык, просто общий подход к созданию ключей, будь то шифрование деталей приложения для пользователей или хэш или хэш случайной строки и т.д. Должны ли мы беспокоиться о хэш-алгоритме (MSD, SHA1, bcrypt) и т.д.

Edit: Я говорил с несколькими друзьями (электронная почта/твиттер), и они рекомендовали использовать GUID с отключенными штрихами.

Это кажется немного взломанным для меня, хотя, надеясь получить еще несколько идей.

4b9b3361

Ответ 1

Используйте генератор случайных чисел, предназначенный для криптографии. Затем base-64 кодирует число.

Это пример С#:

var key = new byte[32];
using (var generator = RandomNumberGenerator.Create())
    generator.GetBytes(key);
apiKey = Convert.ToBase64String(key);

Ответ 2

Ключи API должны иметь следующие свойства:

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

Обычно у вас будут тысячи или миллионы ключей API, а не миллиарды, поэтому им не нужно:

  • Надежно хранить информацию о пользователе API, поскольку она может храниться в вашей базе данных.

Таким образом, одним из способов генерации ключа API является получение двух частей информации:

  • серийный номер, гарантирующий уникальность
  • достаточно случайных бит для выключения ключа

и подпишите их, используя секретный секрет.

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

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


или хэш случайной строки

Хеширование не предотвращает подделку. Подписание - это то, что гарантирует, что ключ пришел от вас.

Ответ 3

Я использую UUID, отформатированные в нижнем регистре без тире.

Поколение легко, поскольку большинство языков оно встроено.

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

Ответ 4

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

Раньше версии Windows выпускали предсказуемые GUID, например, но это старая история.

Ответ 5

В Raygun.io мы создаем UUID/GUID, а затем вычисляем хэш MD5, а затем base64 кодируем результат, вот некоторые образец кода С#, показывающий, как:

using (var hash = MD5.Create())
{
  Value = Convert.ToBase64String(hash.ComputeHash(Guid.NewGuid().ToByteArray()));
}