web-dev-qa-db-ja.com

APIキーとシークレットの生成についてアドバイスが必要ですか?

Spring-boot、Spring-security、JWTトークンを使用してJavaプロジェクトに取り組んでいる間、APIキーとシークレットを介してアクセスを提供する必要があります。キー/シークレットの生成についてGoogleでしばらく検索した後、ここに私が見つけたものがあります:

  • 鍵の生成には、-なしの暗号で保護されたUUIDが適切な選択のようです。
  • 秘密の生成については、まだ明確な提案はありませんでした。しかし、他の一部のサイトでは、シークレットにHMAC-SHA512アルゴリズムを使用しており、それをキーのbase64文字列表現(88文字までパディングされたもの)として保存しているようです。

APIのキーとシークレットを説明するリンクがいくつかあります。

APIキー/シークレットアクセスを提供するビットコインサイトの例:

質問は次のとおりです:

  • シークレットにはどのアルゴリズムが適していますか?
  • Sha256またはsha512アルゴリズムは良い選択ですか?はいの場合、その生成についていくつかの提案があると役に立ちます。
3
Eric Wang

クライアントIDとシークレットのセキュリティ要件を混乱させていると思います。

  • クライアントID:一意である必要があり、推測できない場合はより適切です。それらは一般に公に宣伝されていませんが、シークレットほど注意深く扱われていません。
  • 秘密:推測できず、秘密にしておく必要があります。シークレットの漏えいの可能性は、セキュリティインシデントであり、鍵の即時失効が必要です。

クライアントIDがどのように見えるかは、一種の好みの問題です。参照する oauth.com サイトの例には、さまざまなサイズと形式のキーが含まれています。乱数は良い選択です。 (擬似コードで)のようなもの:

clientID = base64Encode(secureRandom(16)); // 16 bytes, 128 bits, 22 characters

安全でない乱数を使用できる場合もありますが、それが予測可能性につながる場合があります。安全な乱数ジェネレータをそのまま使用してください。少しだけ遅く、安全であることが保証されています。

シークレットを生成する唯一の方法は、secure乱数ジェネレータを使用することです。

secret = base64Encode(secureRandom(32)); // 32 bytes, 256 bits, 43 characters

シークレットはクリアテキストで保存しないでください。それらを暗号化し、暗号化キーを安全な場所に保存します。

GUIDについて言及しましたが、 ランダムバージョン4 も実装によって異なります。安全なものもあれば、そうでないものもあります。だから私は彼らから離れたままにします。 SHA256およびSHA512ハッシュアルゴリズムについても説明しました。乱数の計算にそれらを使用することは可能ですが、それを正しく行うのは複雑です。安全な乱数ジェネレータを使用するだけで安全です。

すでにSpringを使用しているので、実装にはおそらく RandomValueStringGenerator が適しています。正しいバイト数のジェネレータを作成するだけです。参照のために、そのクラスの ソースコード を確認することもできます。

2
Neil Smithline