web-dev-qa-db-ja.com

なぜHMACの対称鍵なのですか?

RESTful APIの保護に取り組んでおり、ガイドとして Amazon AWS HMACモデル を使用しています。対称鍵を自分の側に保管するための安全な方法を考え出すのに苦労しています。標準的な方法は何ですか?これは、Java Solaris環境で実行されているWebアプリです。

非対称キーではなく、共有キーの安全なストレージと通信の付随する苦痛を伴う対称キーが使用される理由はありますか?速度の違い、つまりスケーリングの問題があることはわかっていますが、他に何が不足していますか?

19
user25231

[〜#〜] hmac [〜#〜] で使用されるキーは、定義により対称です。同じキーが計算MAC値、および検証MAC値 デジタル署名アルゴリズム は非対称です。つまり、検証用のキーは、生成に使用されるキーとは異なります。この「違い」は強力です。生成に使用されるキーは、検証に使用されたキー(少なくとも、だれもがばかげていない時間に、既存のテクノロジーを使用してそれを行う方法は誰も見つかりませんでした)。

デジタル署名は、検証者が署名を検証できる必要があるが、独自の他の署名を生成する権限を与えられていない状況では意味があります。これは、否認防止シナリオの典型です。有効な署名を生成できるのは署名者のみである必要があります。そうでない場合、署名はその特定の署名者に明確に帰属することはできませんサードパーティによって(たとえば、裁判官))。ただし、認証シナリオではAmazon AWSのように、納得するサードパーティはありません。クライアントとAmazonしかありません。HMAC値が正常に検証されると、Amazonサーバーは、HMACキーを知っている誰かが関与していると確信します。クライアントとサーバー自体、およびサーバーはそのメッセージのキーを自分で使用しなかったことを記憶しているため、サーバーはclientがHMACを計算したと簡単に結論付けます。

デジタル署名はいくつかのオーバーヘッドを意味します:

  • より多くのCPU:デジタル署名を生成し、デジタル署名を検証するには、HMACよりも多くの作業が必要です(大きなメッセージの場合、違いは無視できますが、小さなメッセージの場合は重要です)数キロバイト未満)。

  • より多くのネットワーク帯域幅:非常に堅牢なHMAC値は16バイトに収まりますが、同等に堅牢なRSA署名は256バイトを使用します(これは約64に下げることができます) DSAまたはECDSAのバイト)。繰り返しになりますが、これは多くの小さなメッセージを処理するときに重要です。

  • より多くのストレージサイズ:RSA公開鍵(検証用)は256バイトを使用します。秘密鍵はさらに使用します(約1または2キロバイト)。 ECDSAはある程度(どちらのキーでも約32バイトまで)役立ちますが、それでもHMACキーの16バイトよりも大きいです。

  • ランダム性:多くのデジタル署名は、署名ごとのランダム性を必要とします。これは 暗号化された安全なPRNG から取得する必要があります。

  • より複雑:デジタル署名に関連する数学とコードはHMACよりも複雑です(HMACはハッシュ関数呼び出しのペアにすぎません。デジタル署名はハッシュで始まります関数の呼び出し、そして奇妙なことをします)。セキュリティのために、複雑さはbadです。

したがって、より単純なHMACで同様に提供できるコンテキストでデジタル署名を使用することは望ましくありません。私の見解では、最も説得力のある理由は最後の理由です。複雑さは避けられるべきです。

26
Thomas Pornin