Webサイトの開発に携わっている多くの人は、遅かれ早かれ、サーバー上でユーザーが送信するデータのセキュリティ、特にパスワード送信のセキュリティについて考えました。
最近では、卒業プロジェクトを完了するときに(ところで、トピック「オンライン学習管理システム」について)、私はそれについて考えました。 認証中のパスワードセキュリティを改善するためのアイデアを思いつきました。 このアイデアは完全ではなく、完全に考え抜かれていないので、知識のある人と共有したいと思います。
理論
主な目標は、サーバーへの「途中」でパスワードが傍受されるのを防ぐことです。 サーバー上で、データベースはログイン、パスワードのMD5ハッシュ、およびサーバーがその後の認証のためにCookieでユーザーに提供する文字列を保存します。 この単純なモデルは単なる例です。
私のアイデアの本質は、パスワードの代わりにWebページからサーバーに、パスワードハッシュが送信されることです。 攻撃者はハッシュを傍受してログインできると言うでしょう。 しかし、違います。 送信されるハッシュは一種の動的なもの、つまり 時期によって異なります。
どのように機能しますか?
次の形式でサーバーにパスワードを送信することをお勧めします:
MD5(MD5()+UNIX-timestamp)
ページのログインフォームに入力した後、ユーザーは「ログイン」ボタンをクリックします。その後、JavascriptがパスワードからMD5ハッシュを取得し、現在のUNIX時間をこの行に追加し、受信した行からMD5を再度取得します。 この値は、パスワードの代わりにフィールドで置換されます。 また、ログインフォームでは、UNIX時刻が挿入される非表示タイプのフィールドを挿入する必要があります。 スクリプトの実行後、データがサーバーに送信されます。
サーバー側では、指定されたログインによってデータベースから文字列が取得され、MD5がサーバーブラウザーが送信した文字列(UNIX時間+ [データベースからのパスワードハッシュ])と等しいかどうかがチェックされます。 はいの場合、認証は成功し、後続の認証のためにランダムな文字列がクッキーでユーザーに送信され、データベースにも書き込まれます。
落とし穴
いわば、この技術にはいくつかの欠点があります。
1.主なものは時間に関連しています。 これはユーザー側であり、サーバー側でもほぼ同じである必要があります(これがどれくらいかわかりません。±60秒かかることをお勧めします)。 同時に、これは追加のセキュリティ要素の1つになります。データを1回傍受することにより、攻撃者は後でログインできなくなります。サーバーがリクエストの到着時刻を確認するためです。
2.そして、攻撃者がデータを受信した後、すぐにログインしようとするとどうなりますか? 同じ±60秒が経過していない可能性があるため、彼は成功します。 この問題を解決するために、フォームで、サーバーがキー(randonmoによって形成される)を配置する隠しタイプの別のフィールドを導入することを提案します。 このキーは、時間とパスワードとともに暗号化され、サーバーに戻され、そこでチェックされます。
3. 3番目も時間に関連しています。 突然、ユーザーがコンピューターの設定時間をサーバーの時間とは根本的に異なる場合、どうすればよいでしょうか? 「わかりません」と言います。 将来のアイデアは1つありますが、サーバーにデータを送信する前に、WebページをサーバーへのAJAX要求にして、時間を見つけてからデータを送信することができます。 ちなみに、同じリクエストに同じランダムキーが来る場合があります。
そして、キーでオプションを作成することは不可能でしたか?
いいえ、できません。 これが私の考えです。 最初のコンセプトは、リクエストが生成されたときに時間チェックを使用することでした。 オープンキーの考えは、ずっと後に思い浮かびました。
結果
一挙に、いくつかのレベルの保護が得られます。パスワードはクリアテキストで送信されず、時刻がチェックされ、公開キーが適用されます。
私たちにはすべてがあり、何もありません。 その時私はほとんど時間がなかったので、それをすべて実現することはできませんでした。 すぐに使えるアイデアがあります。
親愛なるKhabravchans、私に言って、このアイデアを開発する価値はありますか? 私は今この点でいくつかの基礎を持っています。 あなたが私の考えを好めば、次の記事で私の仕事の結果を公開します。 誰かがこの主題に関して何か提案をしているなら、書いてください。 あなたの批判を事前に感謝します。