Лучший подход для генерации ключа API
Итак, с большим количеством различных сервисов вокруг сейчас, Google APIs, Twitter API, Facebook API и т. д.
каждая служба имеет ключ API, например:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
все ключи различаются по длине и символам, которые они содержат, мне интересно, какой лучший подход для создания ключа API?
Я не прошу определенного языка, просто общий подход к созданию ключей, должны ли они быть шифрованием деталей приложения пользователей или хэш или хэш случайной строки и т. д. Должны ли мы беспокоиться о хэш-алгоритме (MSD, SHA1, bcrypt) и т. д.?
Edit: Я говорил с несколькими друзьями (электронная почта/twitter), и они рекомендовали просто использовать GUID с разделенными тире.
это кажется мне немного избитым, хотя, надеясь получить больше идей.
5 ответов
используйте генератор случайных чисел, предназначенный для криптографии. Затем база-64 кодирует число.
Это пример C#:
var key = new byte[32];
using (var generator = RandomNumberGenerator.Create())
generator.GetBytes(key);
string apiKey = Convert.ToBase64String(key);
ключи API должны иметь свойства, которые они:
- однозначно определить авторизованного пользователя API -- "ключ" часть "ключ API"
- проверка того, что пользователь-не угадал/кованые
- может быть отозван, если пользователь плохо себя ведет -- обычно они ключ в базу данных, которая может иметь запись удалена.
обычно у вас будут тысячи или миллионы ключей API, а не миллиарды, поэтому им не нужно кому:
- надежно хранить информацию о пользователе API, потому что это может быть сохранено в вашей базе данных.
таким образом, один из способов создания ключа API-это взять две части информации:
- серийный номер для гарантии уникальности
- достаточно случайных битов, чтобы заполнить ключ
и подпишите их, используя личный секрет.
счетчик гарантирует, что они однозначно идентифицируют пользователей, и подписание предотвращает подделку. Отзываемость требует проверки того, что ключ все еще действителен в базе данных, прежде чем делать что-либо, требующее авторизации API-ключа.
хороший генератор GUID-это довольно хорошее приближение инкрементного счетчика, Если вам нужно генерировать ключи из нескольких центров обработки данных или не иметь в противном случае хорошего распределенного способа назначения серийных номеров.
или хэш случайной строки
хэширование не предотвратить подделку. подписи это гарантирует, что ключ пришел от вас.
Я использую UUIDs, отформатированный в нижнем регистре без тире.
поколение легко, так как большинство языков имеют его встроенный.
ключи API могут быть скомпрометированы, и в этом случае пользователь может захотеть отменить свой ключ API и создать новый, поэтому ваш метод генерации ключей должен удовлетворять этому требованию.
ключ API должен быть случайным значением. Достаточно случайная, чтобы ее нельзя было предсказать. Он не должен содержать никаких сведений о пользователе или учетной записи, для которой он предназначен. Использование UUIDs-хорошая идея, если вы уверены, что созданные идентификаторы случайны.
более ранние версии Windows производили предсказуемые GUID, например, но это старая история.
Если вы хотите ключ API только с буквенно-цифровыми символами, вы можете использовать вариант base64-random подход, ТОЛЬКО используя кодировку 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();
}