Итак, сейчас есть множество различных сервисов, Google API, Twitter API, Facebook API и т. Д.
У каждой службы есть ключ API, например:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
Все ключи различаются по длине и символам, которые они содержат. Мне интересно, какой подход лучше всего для создания ключа API?
Я не прошу конкретный язык, просто общий подход к созданию ключей, должны ли они быть шифрованием деталей пользовательского приложения, или хешем, или хешем случайной строки и т. Д. Стоит ли нам беспокоиться о хеш-алгоритме (MSD, SHA1, bcrypt) и т. Д.?
Изменить: я поговорил с несколькими друзьями (электронная почта / твиттер), и они рекомендовали просто использовать GUID с удаленными дефисами.
Мне это кажется немного взломанным, я надеюсь получить еще несколько идей.
Ответы:
Используйте генератор случайных чисел, предназначенный для криптографии. Затем кодируйте число по системе base-64.
Это пример C #:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
источник
apiKey
мог быть объявлен в другом месте. Я добавил тип для наглядности.Ключи API должны иметь следующие свойства:
Обычно у вас есть тысячи или миллионы ключей API, а не миллиарды, поэтому им не нужно:
Таким образом, один из способов создания ключа API - это взять две части информации:
и подписать их, используя личный секрет.
Счетчик гарантирует, что они однозначно идентифицируют пользователя, а подпись предотвращает подделку. Возможность отзыва требует проверки того, что ключ все еще действителен в базе данных, прежде чем делать что-либо, требующее авторизации ключа API.
Хороший генератор GUID - довольно хорошее приближение к инкрементному счетчику, если вам нужно сгенерировать ключи из нескольких центров обработки данных или нет другого хорошего распределенного способа присвоения серийных номеров.
Хеширование не предотвращает подделку. Подписание - это гарантия того, что ключ пришел от вас.
источник
Я использую UUID в нижнем регистре без тире.
Генерация проста, поскольку она встроена в большинство языков.
Ключи API могут быть скомпрометированы, и в этом случае пользователь может захотеть отменить свой ключ API и сгенерировать новый, поэтому ваш метод генерации ключей должен соответствовать этому требованию.
источник
UUID uuid = UUID.randomUUID();
Java? Вы хотите сказать, что случайного выбора недостаточно?Если вам нужен ключ API, состоящий только из буквенно-цифровых символов, вы можете использовать вариант случайного подхода base64 , только вместо этого используя кодировку base-62. Кодер base-62 основан на этом .
public static string CreateApiKey() { var bytes = new byte[256 / 8]; using (var random = RandomNumberGenerator.Create()) random.GetBytes(bytes); return ToBase62String(bytes); } static string ToBase62String(byte[] toConvert) { const string alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; BigInteger dividend = new BigInteger(toConvert); var builder = new StringBuilder(); while (dividend != 0) { dividend = BigInteger.DivRem(dividend, alphabet.Length, out BigInteger remainder); builder.Insert(0, alphabet[Math.Abs(((int)remainder))]); } return builder.ToString(); }
источник
Ключ API должен быть случайным значением. Достаточно случайный, чтобы его нельзя было предсказать. Он не должен содержать никаких сведений о пользователе или учетной записи, для которых он предназначен. Использование UUID - хорошая идея, если вы уверены, что созданные идентификаторы случайны.
Например, более ранние версии Windows выдавали предсказуемые идентификаторы GUID, но это старая история.
источник