web-dev-qa-db-ja.com

APIキーをデータベースに保存する前に、ハッシュまたは暗号化する必要がありますか?

REST APIキーを使用して構築しているサービスへのAPI呼び出しを保護しています。計画は次のとおりです。

  1. 新しいクライアントを取得したら、APIキー(UUID)を生成します。
  2. APIキーをメールで送信します。
  3. サービスへのすべての呼び出しで(HTTPSを介して)APIキーを送信します。データベースでAPIキーを検索し(暗号化またはハッシュ化してから)、APIキーのアカウントを特定します。

最終的には、これらすべてのユーザーアカウントとポータルを追加して、クライアントが関与しなくてもAPIキーを生成して非アクティブ化できるようにします。

最後の質問です。データベースに格納する前に、APIキーをハッシュまたは暗号化する(または暗号化しないままにする)必要がありますか?私はその意味を理解しようとしています。私はそれらをハッシュすると、DBアクセスを取得した場合にすべてのAPIキーを知っている誰かから保護していることを知っています。しかし、私が他に考えるべきことは何ですか?たとえば、一方を他方に実行するパフォーマンス上の理由はありますか?

6
Daniel Hipke

はい、APIキーは完全にハッシュする必要があります。実際には、それらはパスワードであり、そのように扱う必要があります。ハッシュ化されていることに注意してください-暗号化されていません。 APIキーを復号化する必要はないため、復号化することはできません。

saghaulor が言うように、バージョン4のUUID(つまり、ランダムなもの)を使用し、それらを生成するときに、暗号化された安全なランダム性のソースを使用する必要があります。正しく生成されたUUIDには 122ビットのエントロピー が含まれているため、ソルト処理やbcryptなどの低速ハッシュ関数の使用について心配する必要はありません。 SHA-256は1回で十分です。

設計の問題のある部分は、メールで配信される「パスワード」をユーザーに提供することと、ユーザーが変更できないことです。これは、セキュリティを重視するユーザーにとっては十分ではないかもしれません。おそらく、あなたが言及するポータルはこの問題を解決するでしょう。

8
Anders

1)UUIDの生成に安全なランダムジェネレーターを使用していることを確認します。

2)APIキーをメールで送信しないでください。電子メールは安全な転送を保証していません。つまり、キーを平文で送信している可能性があります。

3)認証メカニズムの実装方法は、APIキーの保存方法に影響します。

APIキーを主キーとして使用する場合は、ハッシュまたは暗号化することはできません。ハッシュ化または暗号化を正しく行うと、検索が事実上不可能になるためです。

ユーザーに提供するものが主キーとAPIキーの組み合わせである場合、APIキーを安全に保存できます。キーは事実上パスワードであるため、ハッシュで十分であり、推奨されます。

アルゴリズムを正しく使用することを忘れないでください。一般に、ハッシュでは各レコードにソルトが必要です。異なるハッシュアルゴリズムがあります。 bcryptやscryptなどのいくつかは、ブルートフォースを遅くするために人工的なレイテンシを追加できます。これは、ユースケースに適している場合とそうでない場合があります。 MD5やSHA1など、安全でないことが証明されているアルゴリズムは推奨されません。

ソルトなしでキーをハッシュすると、簡単な検索を実行できます。これはソルトによるハッシュほど安全ではありませんが、上記のアプローチのセキュリティで十分かもしれません。

1
saghaulor