[security] API 키 생성을위한 최상의 접근 방식

따라서 현재 다양한 서비스, 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);


답변

API 키에는 다음과 같은 속성이 있어야합니다.

  • 인증 된 API 사용자를 고유하게 식별합니다. “API 키”의 “키”부분
  • 해당 사용자 인증-추측 / 위조 불가
  • 사용자가 잘못 행동하면 취소 될 수 있습니다. 일반적으로 레코드를 삭제할 수있는 데이터베이스에 입력합니다.

일반적으로 수십억이 아닌 수천 또는 수백만 개의 API 키가 있으므로 다음을 수행 할 필요가 없습니다.

  • API 사용자에 대한 정보는 데이터베이스에 저장할 수 있으므로 안정적으로 저장합니다.

따라서 API 키를 생성하는 한 가지 방법은 다음 두 가지 정보를 가져 오는 것입니다.

  1. 고유성을 보장하는 일련 번호
  2. 키를 패딩하기에 충분한 임의 비트

개인 비밀을 사용하여 서명하십시오.

카운터는 사용자를 고유하게 식별하고 서명을 통해 위조를 방지합니다. 재 할당하려면 API 키 인증이 필요한 작업을 수행하기 전에 키가 데이터베이스에서 여전히 유효한지 확인해야합니다.

좋은 GUID 생성기는 여러 데이터 센터에서 키를 생성해야하거나 일련 번호를 할당하는 좋은 분산 방법이없는 경우 증분 카운터의 근사치입니다.


또는 임의의 문자열의 해시

해싱은 위조를 방지하지 않습니다. 서명 은 열쇠가 당신에게서 나왔다는 것을 보증하는 것입니다.


답변

대시없이 소문자로 포맷 된 UUID를 사용합니다.

대부분의 언어에 내장되어 있기 때문에 생성이 쉽습니다.

API 키가 손상 될 수 있으며,이 경우 사용자가 API 키를 취소하고 새 키를 생성 할 수 있으므로 키 생성 방법이이 요구 사항을 충족 할 수 있어야합니다.


답변

영숫자 문자 만 포함 된 API 키를 원하는 경우 base-62 인코딩 만 대신 사용하는 base64-random 접근 방식 의 변형을 사용할 수 있습니다 . 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 키는 임의의 값이어야합니다. 예측할 수 없을 정도로 무작위입니다. 사용자 또는 계정에 대한 세부 정보를 포함해서는 안됩니다. 생성 된 ID가 무작위라고 확신하는 경우 UUID를 사용하는 것이 좋습니다.

예를 들어 이전 버전의 Windows는 예측 가능한 GUID를 생성했지만 이것은 오래된 이야기입니다.


답변