iOSアプリケーションでいくつかの文字列を暗号化および復号化するために使用しているコードがあります。コードには CCCrypt の使用が含まれます。キーを実際にどこにも保存せずに、使用されるキーの有効性をテストする信頼できる方法はありますか? 私の調査によると、鍵が有効かどうかを判断する唯一の方法は、鍵の長さと鍵のハッシュを使用することです。誰でもこれを適切な方向に導くことができますか?
3 に答える
答えを得るには、適切な暗号化に関する背景知識が少し必要です。すでにご存知かもしれませんが、ほとんどの人がこれを間違っているので、ここで取り上げます。(パスワードで暗号化していて、少なくとも HMAC、2 つのソルト、および IV をエンコードしていない場合は、間違っています。)
まず、CCHmac()
非認証モード (AES-CBC など) で暗号化するときは常に HMAC (を参照) を使用する必要があります。そうしないと、攻撃者が暗号文を変更して、別のメッセージに復号化する可能性があります。この攻撃の例については、モードを参照してください。HMAC は、キーに基づく暗号的に安全なハッシュです。
次に、パスワードベースの暗号化を使用している場合は、KDF を使用してキーに変換する必要があります。最も一般的なのは PBKDF2 です。パスワードバイトをキーにコピーすることはできません。
このようにパスワードを使用していると仮定すると、通常、暗号化用と HMAC 用の 2 つのキーを生成します。
OK、これらのパーツを配置したら、パスワードが正しいことを確認できます。正しくない場合、HMAC は失敗するためです。これがRNCryptor のやり方です。
この単純なアプローチには 2 つの問題があります。パスワードを確認する前にファイル全体を処理する必要があることと、ファイルの破損と不正なパスワードを検出する方法がないことです。
これらの問題をある程度修正するには、HMAC を個別に実行する余分なデータの小さなブロックを追加できます。次に、ファイル全体ではなく、その小さなブロックを検証します。これは基本的にaescryptが行う方法です。具体的には、ファイル全体を暗号化するための「実際の」キーを生成し、そのキーを PBKDF2 で生成されたキーと HMAC で個別に暗号化します。不正なパスワードのように見える不正な形式もありますが、この方法で見分けるのは少し簡単です。
キーで暗号化された既知の値をデータベースに保存できます。キーが正しいかどうかの検証は簡単です。既知の文字列を暗号化し、それをデータベース内の暗号化された出力と比較します。単一のデータ ブロックに固執する場合は、操作モードを気にする必要がなく、シンプルに保つことができます。
キーのハッシュを保存することもできますが、私はキーをパスワードとして扱い、データベースにパスワードを保存する際に講じるすべての防御手段を講じます (たとえば、bcrypt を使用する、ハッシュをソルトするなど)。
これらの値を保存できない場合は、実際の内容がわからないものの、おそらくメッセージのいくつかのプロパティ (たとえば、ASCII テキスト、文字列のどこかに今日の日付があるなど) を知っているものを復号化し、復号化されたものをテストできます。それらのプロパティのメッセージ。次に、これらのプロパティを持たない復号化されたブロック (たとえば、MSB が設定されたバイトがあり、日付のインスタンスがない) の場合、キーが無効であることがわかります。この場合、誤検知の可能性がありますが、可能性は非常に低いです。
一般的に、私はピーター・エリオットに同意します。ただし、追加のコメントがいくつかあります。
a)キーがランダムに生成された場合、キーのハッシュを保存しても安全です
b) 元のメッセージのハッシュを暗号化されたメッセージにいつでも添付できます (それを制御できる場合)。このような場合、メッセージを復号化し、復号化されたメッセージのハッシュを取得し、それを元のメッセージのハッシュと比較できます。それらが等しい場合、正しいキーが復号化に使用されました。