web-dev-qa-db-ja.com

APIキーを生成するための最良のアプローチ

現在、Google API、Twitter API、Facebook APIなど、さまざまなサービスがたくさんあります。

各サービスには、次のようなAPIキーがあります。

AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q

すべてのキーの長さおよび含まれる文字は異なりますが、APIキーを生成するための最善のアプローチは何ですか?

ユーザーアプリの詳細の暗号化、ハッシュ、またはランダムな文字列のハッシュなど、特定の言語ではなく、キーを作成するための一般的なアプローチを求めているわけではありません。 (MSD、SHA1、bcrypt)など?

編集:数人の友人(電子メール/ Twitter)と話しましたが、ダッシュを削除したGUIDを使用することをお勧めします。

しかし、これは少しハッキーなように思えますが、さらに多くのアイデアを得たいと思っています。

61
Phill

暗号化用に設計された乱数ジェネレーターを使用します。次に、base-64で数値をエンコードします。

これはC#の例です。

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

APIキーには、次のプロパティが必要です。

  • 許可されたAPIユーザーを一意に識別する-「APIキー」の「キー」部分
  • そのユーザーを認証します-推測/偽造できません
  • ユーザーが不正に動作した場合は取り消すことができます。通常は、レコードを削除できるデータベースにキー入力します。

通常、数十億ではなく数千または数百万のAPIキーを持っているため、次の必要はありません。

  • データベースに保存できるため、APIユーザーに関する情報を確実に保存します。

そのため、APIキーを生成する1つの方法は、2つの情報を取得することです。

  1. 一意性を保証するシリアル番号
  2. キーをパディングするのに十分なランダムビット

プライベートシークレットを使用して署名します。

カウンターは、ユーザーがユーザーを一意に識別することを保証し、署名は偽造を防ぎます。取り消し可能性では、APIキーの認証が必要な操作を行う前に、データベースでキーがまだ有効であることを確認する必要があります。

優れたGUID=ジェネレーターは、複数のデータセンターからキーを生成する必要がある場合、またはシリアル番号を割り当てるための適切な分散方法がない場合、増分カウンターのかなり良い近似です。


またはランダムな文字列のハッシュ

ハッシュは偽造を防止しません。 署名 は、鍵があなたからのものであることを保証するものです。

25
Mike Samuel

ダッシュなしで小文字でフォーマットされたUUIDを使用します。

ほとんどの言語に組み込まれているため、生成は簡単です。

APIキーが危険にさらされる可能性があります。その場合、ユーザーはAPIキーをキャンセルして新しいキーを生成することができるため、キー生成メソッドはこの要件を満たす必要があります。

5
Adam Ralph

英数字のみのAPIキーが必要な場合は、 base64-random アプローチのバリアントを使用できます。代わりにbase-62エンコーディングのみを使用します。 base-62エンコーダーは this に基づいています。

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();
}
1
Edward Brey

APIキーはランダムな値である必要があります。予測できないほどランダムです。ユーザーまたはアカウントの詳細を含めるべきではありません。作成されたIDがランダムであることが確実な場合は、UUIDを使用することをお勧めします。

たとえば、以前のバージョンのWindowsは予測可能なGUIDを生成していましたが、これは古い話です。

1