web-dev-qa-db-ja.com

AESと一緒にHMACを使用する場合

私のクライアントの1つが、システムに登録するために各顧客にURLを提供したいと考えています。このURLには、次のように、CBCでAESを使用して暗号化されたクライアントからのデータ(コード、電子メール、名前など)を含むクエリ文字列パラメーターが含まれます(IVは太字)。

www.website.com/register?key=44a74fb9fad889496e970c604e54fdab a367c6e5802252822ce071c35d7f108aea43e6de925cf93dd3d4772974621927a12702428b1d22d82b6f976acc7470f8

ユーザーがこのページに入ると、ページが復号化され、データが有効かどうか(たとえば、顧客のコードが外部データベースで有効で、まだ登録されていないかどうか)が確認され、登録フォームが表示されます。

AESと一緒にHMACを使用してデータを暗号化する人を見たことがありますが、このような場合にこれが必要かどうかはわかりません。私の質問は、これで十分ですか?データを認証するためにAESで暗号化する前に、プレーンテキストと共にHMACなどを使用する必要がありますか?

23
Guilherme Sehn

AESはencryption; 機密性を維持するためのものです。暗号化はそれ自体では整合性を維持しません:暗号化されたデータにアクセスできる攻撃者はバイトを変更できるため、クリアテキストデータに影響を与えます(ただし、暗号化により攻撃者にとってタスクは少し難しくなります) 、それはしばしば想定されるほど実行不可能ではありません)。

integrityを取得するには、 [〜#〜] mac [〜#〜] が必要であり、HMACは素晴らしいMACですアルゴリズム。

暗号化が義務付けられている多くの状況では、整合性も維持する必要があるため、原則として、AESの「単独」では不十分です。あなたの場合、潜在的な攻撃者は顧客自身です。各顧客は、他の誰かのデータにアクセスしたり、別の名前で登録したりできるように、URLを変更しようとする可能性があります。私の理解では、あなたの「クライアント」は登録のマスターであり続けたいと思っています。彼は、どの顧客がどの名前で登録できるかを決定したいと考えています。したがって、整合性のチェックが必要です。


AESベースの暗号化とHMACを組み合わせる方法はいくつかあります。それらのほとんどは悪いです。この件に関する議論については この質問 を参照してください。話を短くするには:

  • 可能であれば、 [〜#〜] gcm [〜#〜] を使用するか、暗号化とMACを安全に組み合わせるというハードワークをすべて実行する他のモードを使用してください。

  • GCMを使用できない場合(サーバー側のプログラミングフレームワークがサポートされていないため)、古いスタイルの処理を行う必要があります。

    • [〜#〜] k [〜#〜]をSHA-256でハッシュして、256ビットの「鍵素材」を取得します。それを2つに分割します。128ビットの暗号化(Ke)、MACの128ビット(Kメートル)。
    • 128ビットのランダム[〜#〜] iv [〜#〜]を生成します。暗号化するたびに新しいものが必要であり、強力なPRNG(/dev/urandom)。
    • データを埋め込み(通常はPKCS#5埋め込み)、その長さがAESブロックサイズ(16バイト)の倍数になるようにします。
    • 直前に生成されたIVとKを使用して、CBCモードのAESでデータを暗号化します。eキーとして。結果の暗号文を[〜#〜] c [〜#〜]と呼びましょう。
    • Kを使用してHMAC/SHA-256を計算するメートル[〜#〜] iv [〜#〜][〜#〜] c [〜#〜の連結の上]、この順序で。 [〜#〜] m [〜#〜]結果の値を呼び出します。 [〜#〜] iv [〜#〜]がHMACへの入力の一部であることが重要です。
    • 連結[〜#〜] iv [〜#〜][〜#〜] c [〜#〜]および[〜#〜] m [〜#〜]、この順序で。これが「登録キー」です。
    • 登録要求を受け取ったら、まずHMACを(再計算して)確認し、次に(そしてその後のみ)復号化ステップに進みます。

もちろん、これはすべて、クライアントが顧客の登録キーを生成するために使用できるキー[〜#〜] k [〜#〜]があることを前提としています。また、サーバーは、受信した登録要求を検証および復号化するためにも知っていること。すべてのキーと同様に、保管場所にも注意してください。

38
Thomas Pornin