Лучший подход для генерации ключа 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-это взять две части информации:

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

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

счетчик гарантирует, что они однозначно идентифицируют пользователей, и подписание предотвращает подделку. Отзываемость требует проверки того, что ключ все еще действителен в базе данных, прежде чем делать что-либо, требующее авторизации 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();
}