'公開鍵'のみを使用している場合(実際には公開鍵ではありませんが、これはナンスであり、特定の時間枠で使用できるようにしたい場合を除いて、実際にはランダムである必要があります。その場合は、次のことを確認してください。秘密鍵を使用してHMACを使用して生成し、攻撃者がナンスを予測できないようにします)。これは固定サイズであり、連結は問題にならない可能性があります。
とはいえ、よく考えられたセキュリティモデルがないのではないかと少し心配しています。とにかく、これはどのような攻撃を防ごうとしているのでしょうか?ユーザーのパスワードハッシュは無塩であるため、パスワードデータベースを壊すと、とにかくプレーンテキストのパスワードが簡単に明らかになります。時間制限のあるナンスを使用すると、パッシブスニファからのリプレイ攻撃が軽減されますが、このようなパッシブスニファはユーザーのセッションキーを盗む可能性があります。とりあえず。そういえば、タイムスタンプベースのシステムではなく、セッションキーをナンスとして使用しないのはなぜですか?
しかし、実際には、SSLを使用しないのはなぜですか?暗号化を正しく行うのは非常に困難であり、あなたや私よりもはるかに賢い人々が、SSLのセキュリティを正しく確認するために何十年も費やしてきました。
編集:MITM攻撃が心配な場合は、SSL以外の何物もあなたを救うことはできません。限目。マロリーは、非常に安全なログインフォームを、パスワードをプレーンテキストで送信するものに置き換えることができます。ゲームオーバー。また、受動的な攻撃者でさえ、セッションCookieを含め、すべてがネットワーク上を通過しているのを見ることができます。EveがセッションCookieを取得すると、それをブラウザに挿入するだけで、すでにログインしています。ゲームオーバー。
SSLを使用できないと言う場合は、保護しようとしているものと、軽減する攻撃の種類を正確に確認する必要があります。暗号化を行うには、おそらく何らかのデスクトップアプリケーションを実装する必要があります。MITMが使用されている場合、HTMLやJavascriptを信頼することはできません。Malloryはそれらを自由に置き換えることができます。もちろん、デスクトップアプリは、データストリームにキー交換、暗号化、認証を実装する必要があります。さらに、リモートホストの認証も実装する必要があります。これは、SSLが行うこととまったく同じです。また、正しく実行すれば、SSLとほぼ同じアルゴリズムを使用して実行できます。
MITMが範囲外であると判断したが、受動的攻撃から保護したい場合は、おそらくJavascriptで深刻な暗号化を実装する必要があります-決してないセッションキーを生成するためのDiffie-Hellman交換について話している有線(HTML5 Webストレージなど)、キーを保護するためのJavascriptのAESなどを介して送信されます。この時点で、基本的にJavascriptでSSLの半分を実装しましたが、バグが増える可能性があります。これは、Javascriptで安全なランダム番号を取得するのが非常に難しいという問題です。
基本的に、次のいずれかを選択できます。
- 実際の暗号化セキュリティを実装していない(これらの複雑な認証プロトコルをすべて実装しているため、明らかに選択肢ではありません)
- SSLに非常によく似たものを実装しますが、おそらくそれほど良くはありません
- SSLを使用します。
つまり、セキュリティが重要な場合は、 SSLを使用してください。SSLをお持ちでない場合は、インストールしてください。私が知っているJSを実行できるすべてのプラットフォームはSSLも処理できるので、言い訳はできません。