みなさんこんにちは。
ワンタイムパスワードに関する最近議論された記事。 このトピックを作成することはできず、登録やパスワードの変更など、ユーザーとの作業の同様に重要な領域を忘れてしまうため、少し補足したいと思います。
この投稿は、ソケットベースの認証システムでのみ提供されるものであり、今のところ実装を主張することはできません。 そのようなことがすでにどこかで実装されていると確信していますが、ずっと前に、このトピックについてコミュニティを熟考することは面白いと思います。
そのため、完了する必要があるタスクがいくつかあります。
- サーバーで自動クライアント認証のメカニズムを作成します。
- 認証中に最も安全なパスワード転送メカニズムを実装します。このメカニズムでは、パスワードハッシュの盗難はまったく意味がありません。
- パスワード変更メカニズムを安全にします。
- 安全なクライアント登録メカニズムを作成します。
データとタスクの条件
sockets / web socketsで実行されている完全に閉じられたサーバーがあり、壊れて開くことができるクライアントアプリケーションがあります。 クライアントアプリケーションの静的データ(キー、キー生成アルゴリズム、およびクライアントの通常の復号化で簡単に予測できるその他のもの)に遭遇することはありません。
最大の複雑さのために、クライアントはnode-webkitのデスクトッププログラムとしてJavaScriptで記述されています 。 つまり、誰でもクライアントのソースコードにアクセスして、必要な情報をすべて見つけることができます。
1.自動認証のメカニズム
クライアントには認証フォームが提供され、データを入力し、「ログイン」ボタンをクリックした後、アプリケーションはログインとパスワードのデータを引き出します。 ログインは開いたままにします-これは重要な情報ではありません。 パスワードを使用して、小さな奇跡を開始します。
- ウイルスがクリーンユーザーパスワードを表示できないように、パスワードをハッシュします。
- パスワードハッシュはキーで暗号化され、クライアントの永続ストレージに保存される必要があります。 これは、再利用可能にするという目的で行われます。 ハッシュを開いたままにすると、このハッシュを盗まれたウイルスは、メインパスワードを知らなくてもサーバー上で認証できます。 キーとして、コンピューターからシステム情報(ネットワークカードのMACアドレス、ハードウェアの製造番号など)を取得するのが最適です。 これは、ウイルスが侵入した場合に100%のセキュリティを提供するものではありませんが、クラッカーの作業を複雑にします。
- 自動認証では、暗号化されたハッシュが復号化され、一部のデータでソルトされます。
主な問題
残念ながら、キーロガーや直接的なパスワードを解読する別の差し迫った感染症については何もできませんが、悪意のある人のためにうまく配置しています
2.安全な認証
したがって、パスワードハッシュがあります。 次に、このパスワードをソルトする必要があります。 アプリケーションはネットワークベースでもあるため、ソルトとして使用します。
- パスワードハッシュ
- ユーザーの外部IP
- タイムスタンプ、パスワードソルティング用
- ログイン(オプション)
外部IP
簡単かつ簡単に入手できる外部IPから始めましょう。 nodeJSでは、これは次のように行われます(例外などが欠落しています)。
var socket = require('net').createConnection(80, 'google.com');
現在の時刻を含むワンタイムパスワード
ワンタイムパスワードの本質はすでに明らかですが、サーバーとクライアントでの時刻同期の一般的な問題のために、このシステムを少し複雑にします。 これで、クライアントはサーバーに現在の時刻を要求し、それによってサーバーを開き、承認のための一時的なウィンドウのみを作成します。 たとえば、サーバーに現在の時刻を要求しました。 サーバーは現在の時刻を提供し、30秒以内にログインできるようにしました(たとえば)。 この期間中に認証データが到着しなかった場合、サーバーは新しいウィンドウを要求されるまで認証する権利を与えなくなります。
私たちはすぐに2羽の鳥を1石で殺します:同期外れとハッシュ傍受。
サーバー復号化
サーバーでの作業について少し説明します。 ハッシュが来ると、同じ同一のハッシュを作成する必要があります。 パスワード自体のハッシュがあります(データベースに保存されています)。 承認のための一時的なウィンドウがあり、ユーザーIPが接続されています。 同じハッシュを簡単に作成して認証できます。
主な問題
攻撃者はこのハッシュを承認するのに30秒しかありません。また、ハッシュをIPでソルトしたため、同じ外部IPアドレスからこのハッシュを送信する必要があります。被害者と同じネットワーク。 泥棒が別の場所に座って同じIPからインターネットにアクセスできない場合、泥棒はシステムにログインできなくなります。
ここで私はすでに知っている人たちに質問をしています。 サーバーがクライアントのなりすましに気付かないように、攻撃者は自分自身の制御の流れを引き継ぐことができますか?
3.パスワード変更メカニズム
このアクションはめったに発生しませんが、変更によって新しいパスワードが正確に傍受される可能性があります。 私はこのサイトを長い間見ていましたが、新しいパスワードのハッシュを保護するためにSSL / TSL接続を使用することほど良いことは考えられませんでした。
SMSを介してパスワード変更メカニズムの作成を試みることができます。 クライアントは、新しいパスワードを使用して、指定された番号にSMSメッセージを送信します。 システムに深刻な保護が必要な場合は、このメカニズムを使用できます。
主な問題
SSL / TSLを使用しない場合、新しいハッシュが攻撃者によって盗まれる可能性がありますが、他の通信ソースを介したパスワード送信を使用することでこれを回避できます。
4.登録
これは、取り外し可能なパスワードの場合と同じ問題です。 攻撃者がハッシュを盗まないように、ハッシュを何らかの方法でサーバーに転送する必要があります。
クライアントにSMSで送信したり、パスワードをメールで送信したりすることができます。パスワードは、安全なパスワードの変更に基づいて変更できます。
主な問題
パスワードをサーバーに送信する問題に再び遭遇しました。回復には2つのオプションしかありません。 これは、暗号化された通信チャネルまたはパスワードをサーバーに送信するための代替ルートです。
パスワードの転送は、タスクの複雑さに応じて実装する必要があります。 ご存じのように、破ることが難しく、結果にその費用がかからない場合、彼らはそれを破らないでしょう。
緊急の問題
人々は、プロキシ、動的IPなどの事柄に言及します。 次に、それらを分析します。
1)ダイナミックIP
ご存知のように、IPが変更されると、サーバーへの接続が切断されます。 単にリセットされます。 承認手順を再度繰り返す必要があります。 クライアントで再接続を実現し、外部IPを再接続することにより、ユーザーに再接続を見えなくすることは非常に可能です。 したがって、クライアントが障害なく新しい方法でサーバーに接続できるようになります。
2)プロキシ
幸いなことに、プロキシはクライアントの通常の操作を妨げることはできません。 クライアントがオープンプロキシを使用している場合、クライアントは認証の傍受の危険にさらされ、自分にとって悪ピノキオになります。
Habrのユーザーに質問や問題が発生した場合はここに追加してほしい。
のみ
このアルゴリズムは、サーバーの認証がソケット/ Webソケットで発生するシステムでのみ有効です。 プロトコル自体の制限にぶつかり、client-> server-> client-> serverと通信できないため、この認証アルゴリズムをhttp要求に適用する方法を理解できませんでした。 プロトコルの仕様が原因で、最後のノードが機能しなくなりました(おそらく私は間違っています)。
記事の続き
この記事が批判に耐えられる場合は、このメカニズムをJavaScript(node-webkit)とPythonで実装するので、この記事では見落とされる可能性のある物理的な脆弱性についてこのシステムを突くことができます。
みなさんありがとう、建設的な批判とコメントを楽しみにしています。