現在、Google API、Twitter API、Facebook APIなど、さまざまなサービスがたくさんあります。
各サービスには、次のようなAPIキーがあります。
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
すべてのキーの長さおよび含まれる文字は異なりますが、APIキーを生成するための最善のアプローチは何ですか?
ユーザーアプリの詳細の暗号化、ハッシュ、またはランダムな文字列のハッシュなど、特定の言語ではなく、キーを作成するための一般的なアプローチを求めているわけではありません。 (MSD、SHA1、bcrypt)など?
編集:数人の友人(電子メール/ Twitter)と話しましたが、ダッシュを削除した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キーを生成する1つの方法は、2つの情報を取得することです。
プライベートシークレットを使用して署名します。
カウンターは、ユーザーがユーザーを一意に識別することを保証し、署名は偽造を防ぎます。取り消し可能性では、APIキーの認証が必要な操作を行う前に、データベースでキーがまだ有効であることを確認する必要があります。
優れたGUID=ジェネレーターは、複数のデータセンターからキーを生成する必要がある場合、またはシリアル番号を割り当てるための適切な分散方法がない場合、増分カウンターのかなり良い近似です。
またはランダムな文字列のハッシュ
ハッシュは偽造を防止しません。 署名 は、鍵があなたからのものであることを保証するものです。
ダッシュなしで小文字でフォーマットされたUUIDを使用します。
ほとんどの言語に組み込まれているため、生成は簡単です。
APIキーが危険にさらされる可能性があります。その場合、ユーザーはAPIキーをキャンセルして新しいキーを生成することができるため、キー生成メソッドはこの要件を満たす必要があります。
英数字のみの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();
}
APIキーはランダムな値である必要があります。予測できないほどランダムです。ユーザーまたはアカウントの詳細を含めるべきではありません。作成されたIDがランダムであることが確実な場合は、UUIDを使用することをお勧めします。
たとえば、以前のバージョンのWindowsは予測可能なGUIDを生成していましたが、これは古い話です。