私の理解では、IVは最初のブロックの前のブロックとしてのみ使用されます。しかし、各ブロックは以下で使用されるため、これは重要なセキュリティを追加します。IVが提供され、パスワードに基づいていません。
したがって、私はユーザーが両方を提供するときにログインシステムを実装しました。少なくとも3つのタイプ(上、下、数値、特殊、非ASCII)を使用する限り、ユーザーが気にする任意の文字を使用して8文字以上で区別します。
しかし、今や誰かが、IVを定義することで暗号化を弱めるとパスワードがある程度役に立たなくなると私に言った。
私は彼の説明を正確に理解していませんでした。
私のコードは次のようになります:
$hash = openssl_encrypt($username, 'aes-256-cbc', $password, false, md5($iv, true));
この方法でのIVの使用が適切であり、このアイデアが十分強力であるかどうかを誰かが明確にできますか?.
私の疑いは次のとおりです: あなたはそれを間違っています™ 。
これが、頭の上からそう思う理由です。
hash
と呼ばれます。openssl_encrypt
password
がドキュメントによるとキーです。したがって、ユーザーが提供したパスワードからキーを導出しない限り、それはうまくいきません。)しかし、今や誰かが、IVを定義することで暗号化を弱めるとパスワードがある程度役に立たなくなると私に言った。
その人は正しかった。詳細については、AES-CBCでのCSPRNGの使用に関する暗号化に関するリンクされた質問を参照してください。
まず、通常の警告:自分の暗号をロールバックしないでください。間違っている可能性があります。
ここで2番目の警告:AES - [〜#〜] cbc [〜#〜] のみを使用してデータを暗号化しているようです。これは非常に危険です。本当にAES - [〜 #〜] gcm [〜#〜] 、AESのCBC操作モードではメッセージの変更が妨げられず、望ましくない結果が生じる可能性があるため。
暗号化スキームの大きな問題:外部のランダム性を導入しない。
CBCモードでは、unpredictable であるIVが必要です。そうでなければ、攻撃を受けやすくなります。あなたがMD5(pw2)
を使用するという事実により、このIVは予測不可能ですほとんどのパスワードは予測可能になるためです。さらに悪いことに、IVは暗号化にランダム性を導入し、同じ平文を異なる暗号文に暗号化することになっています。ただし、ユーザーがそれを理解できず、パスワードのペアを複数の暗号化で再利用する可能性があるため、静的IV攻撃を受けやすい可能性があります。
別のいくつかのマイナーな問題:
$password
)は正確に32バイトの長さ(AES-256を使用するための要件)および(疑似)ランダム(セキュリティのための正式な要件)であり、ユーザーが32文字を超えるパスワードを選択すると問題が発生する可能性があります。それで、それを修正する方法は?