これは実際には実用的な問題ではなく、好奇心の問題です。 CSの教授が、パスワードのmd5からSHA1ではなくAESにステップアップすることをすすめたそうです。これが実際に多かれ少なかれ安全であるかどうかについて誰かが洞察を持っていますか?
問題についてのいくつかの考え:
回答のいくつかの一般的なポイント、およびカウンターポイント:
AES暗号化は衝突に強いようには設計されていないため、同じハッシュ文字列の長さで衝突が増える可能性があります。
より長いソルトを使用している場合、暗号化されたパスワードはSHA1ハッシュよりも長くなります。これは、衝突を同等のレベルに下げるのに十分かもしれません-あるいはそうでないかもしれません。
AES暗号化により、パスワードの長さが16バイト以内でわかります。
AESメソッドに追加することができます。暗号化した後、適切な長さまでパディングまたはトリミングします(これは、衝突を避けるためにSHA1よりも長くなります)。
短い答え:悪い考え、それをしないでください。
より長い答え:演習のポイントは、サーバーが指定された検証を可能にする何かを格納することですパスワード。ただし、パスワードのrebuildは許可されません。後者の特性が望ましいため、攻撃者によるサーバーデータベースへの不正な読み取りアクセスの影響は制限されたままです。
したがって、与えられたパスワードを検証値に変換する一方向の決定論的変換が必要です。変換は次のとおりです。
MD5またはSHA-1の1回の呼び出しは両方のアカウントで失敗します。これらの関数は非常に高速で、ソルト化されていないためです。スローネスは多くの呼び出し(数千、場合によっては数百万)をネストすることで実行でき、ソルトは「どこかに」注入できますが、その方法には良い方法と悪い方法があります。 PBKDF2 は、それを行う標準の変換であり、悪くはありません(ただし、 bcryptの方が望ましい )。
ただし、MD5とSHA-1は少なくとも1つのことを正しく行います。つまり、一方向であるように設計されています。それは難しいです。一方向関数が実際に存在できることは理論的にも証明されていません。現在、世界中の暗号技術者が competition に関与しており、新しいより優れた一方向ハッシュ関数を設計しています。
したがって、教授が推奨しているように見えるのは、一方向性のために設計された関数を、一方向性のために設計されたではない関数で置き換えることです。速度低下とソルティングについては何も修正しませんが、MD5とSHA-1の1つの良い点を取り除きます。さらに、AESは関連キー攻撃に関して 比較的弱い であることが知られています-意図された目的、つまり暗号化にAESが使用されている限り、これは問題ではありませんが、重要になります一方向ハッシュ関数の構成要素に変換されると問題が発生します。 AESデザインの一部を再利用して安全なハッシュ関数を構築することは可能と思われますが、かなりのやり直しが必要です(たとえば Whirlpool および [〜#〜] echo [〜#〜]を参照) )。
したがって、自家製のAESベースのパスワードハッシュ方式を使用しないでください。さらに言えば、「自家製」のものは使用しないでください。これは災害のレシピです。セキュリティはテストできません。安全なアルゴリズムを作成する唯一の既知の方法は、何百人もの訓練された暗号学者に数年間それを注意深く見させることです。一人ではできません。一人の暗号学者でさえそれを危険にさらすことはありません。
代わりに、bcryptを使用してください。 PBKDF2も悪くありません。
ほとんどのWebサイトはmd5またはsha1(正しい?)を使用していたので、これはハッカーが予期することです。したがって、AESメソッドをより安全にします。
ほとんどのウェブサイトがMD5またはSHA1を使用している場合でも、AESに切り替える通常はそこでは使用されないという理由でそれはそれ以上安全ではありません-それだけです obcursityによるセキュリティ 、これは通常、セキュリティの向上に効果的に貢献しません。優れたアルゴリズムを使用して(所与の目的のために十分にテストされている)、それを公に文書化する方が、優れているかどうかを確認できず、自分がそれを使用します。
現時点では、AESまたはこのような他の暗号化アルゴリズムを使用するときに、次のような欠点が考えられます。
このアプローチで私が目にする1つの直接的な問題は、AESの固定キー長です。 AES-128を使用すると、パスワードの16バイトに制限されます。長いパスワード、または長いパスフレーズはどうですか?
パスワードの長さに対応するには、ハッシュ関数が必要になるため、最初のポイントに戻ります。
ブロック暗号をハッシュ関数に変換する、よく研究された安全な方法があります。Davies-Meyer、Matyas-Meyer-Oseas、Miyaguchi-PreneelなどのPGVモードと呼ばれます。
(*)「セキュア」の適切な定義。
ただし、次の点を考慮してください。
私はあなたのサイトに侵入し、システムにAESキーが構成されていることに気づくのに十分なアクセス権を取得します。「暗号化」されているように見えるのはあなたのパスワードだけです...私がやろうとしていることを推測します。
私はそれらをハッシュ化したままにし、パスワードデータベース全体を簡単にスクレイピングする余地を大幅に減らします。
その上、サイトの所有者として、最初からユーザーのパスワードを解読する機能は望んでいません。それ以外の場合は、「パスワードを回復する」オプションが上級管理者が要求できる機能になり、技術的には基盤となるシステムはハッシュシステムではなく暗号化システムを使用して構築されているため、これを行うことができます(不完全な理由ですが、ソフトウェア開発者はこのような要求を処理します)。
主に:セキュリティが懸念される場合は、奇抜で奇抜なことを行わないでください。アルゴリズムに取り組んでいるチームのチームが大量の調査を行うことができないため、巨大なセキュリティホールを作成する可能性があります。特定の目的のために。
正解は次のとおりです。まったく問題ではありません。
パスワードの場合、唯一の実用的な攻撃は、ブルートフォースで正しいパスワードが見つかるまで、パスワードのリストを試すことです。それを行うためにSHA1やAESを直接攻撃しようとする人はいません。現在の調査時点でさえ、SHA1への攻撃はAESの1万倍も簡単です。どちらも完全に不可能です(ここでは衝突は問題にならないため、パスワードハッシュを元に戻すためです)。そして、研究者が他のアルゴリズムを攻撃する別の方法を見つけると、オッズは来年逆転するかもしれません。
重要なのは、ハッシュの導出/パスワードの暗号化の速度です。しかし、例えばSHA1はより高速であり、(ブルートフォース攻撃を防ぐために)より低速にしたい場合は、複数回ハッシュすることができます。
ハッカーが「期待する」ことはそれほど関連性がなく、何かを「予期しない」ものにすることは単にあいまいです。 「すべてのパスワード文字を逆にすると、より安全になります」と言うようなものです。それはありません。ハッカーがパスワードデータベースにアクセスできる場合、ハッカーがパスワードハッシュ導出関数にアクセスできないことをどのように確認できますか?
「パスワードをそれ自体で暗号化する」際の1つの欠点:暗号化テキストの長さが攻撃者にパスワードの長さについての手掛かりを与える可能性があります。それはひどい。
いずれの場合も、できればユーザーに固有の何かでパスワードをソルトする必要があります。
ブロック暗号から構成されたMAC(メッセージ認証コード)があります。最もよく知られているのはおそらく CBC-MAC です。ハッシュマックと比べて、特に問題があります:
安全なブロック暗号を考えると、CBC-MACは固定長メッセージに対して安全です。ただし、それ自体では、可変長メッセージに対して安全ではありません。正しいメッセージタグ(つまり、CBC-MAC)のペア(m、t)と(m '、t')を知っている攻撃者は、CBC-MACもt 'になる3番目のメッセージm' 'を生成できます。
[...]
この問題は、メッセージサイズのブロックを追加しても解決できません(たとえば、Merkle-Damgård強化を使用)。したがって、可変長メッセージの整合性を保護するために、CMACなどの別の操作モードを使用することをお勧めします。
より短い答え:ブロック暗号から構築されたMACのセキュリティは、それを構築する方法に依存します。単純な構造には、ほぼ間違いなく重大な欠陥があります。
珍しいアルゴリズムを設計したという事実はそれを安全にしません。 「自作」アルゴリズムは危険です。なぜなら、誰もそれらの暗号分析を行っていないからです。
@Thomas Porninが上に書いたように、AESは衝突耐性を持つようには設計されていません。さらに、AESは比較的高速であり、攻撃を単純化します。
SHA1は、衝突に強いように設計されていますが、SHA1は、大量のデータまたはファイルのハッシュを短時間で生成することを目的としているため、非常に高速になるように設計されています。その目的は、ハッシュされたパスワードへの攻撃を防ぐことではありません。
さまざまな種類の攻撃に耐性のあるパスワードハッシュを生成する場合は、パスワードストレッチを検討してください。テクノロジースタックと利用可能なライブラリに応じて、bcrypt、scrypt、argon2を検討してください。