2

Webサイトとそれに対応するヘルパープログラム(ユーザーのコンピューターにインストールされている)を開発しようとしています。Webサイトとプログラムは相互に通信しますが(ほとんどの場合AJAX)、他のWebページがプログラムに要求を送信できる場合はセキュリティ上の大きなリスクになります。私のプログラム(ユーザーのコンピューターにインストールされている)に不正要求を注入することを非常に困難にする解決策を考え出したいです。私の考えではワンタイムパスワードを使用しようとしていますが、セキュリティに関する知識が限られているため、ご意見をお聞かせください。

私はこのワンタイムパスワードアルゴリズム(疑似)を思いついた:

function otp(seed, counter, unix_timestamp, action)
{
    for(i = 0; i < counter; ++i)
    {
        seed = sha256(seed + i);
    }
    str = seed;

    str = sha256(str + unix_timestamp/60);
    str = sha256(str + action);
    otp = substr(str,0,4); //Convert the first for bytes to an int.
    return (int)otp;
}

次のプロパティが必要です。

  • 一度だけ使用できます(すべてのOTP世代で「カウンター」が増加します=>新しいシード)
  • 毎分変更されます(時間によって異なります)。
  • アクション(ログイン、...)にバインドされ、特定のアクションによって異なります。
  • 個別に簡単に生成し、後で同期することができます。

すべてのリクエストにOTPコードとカウンター値が含まれている場合、これは安全ですか?そうでない場合、これを達成するためのヒントは何ですか?上記のすべてのプロパティが本当に必要です。

前もって感謝します。

4

2 に答える 2

6

あなたのアプローチは原則として賢明です。ただし、ハッシュ関数への複数の呼び出しは無意味であることに注意してください。最初のパスで安全であるか、まったく安全ではありません。また、現在、シードを使用して実際にリクエストを認証しているだけであり(攻撃者になる可能性のある人には他のものが知られています)、シード生成の弱点は認証の弱点になります。

私はSHA256の特定の欠点を認識していません。ただし、一般的に問題はかなり一般的であり、標準的な用語で説明および解決する方がはるかに簡単です。プログラムへのリクエストを認証したい。リモートプログラムは、リクエストの信頼性を安全に判断する必要があります。この問題は、公開鍵暗号を使用すると最も簡単に解決できます。たとえば、GnuPGキーのペアを作成し、Webサイトに秘密キーを保持し、プログラムで公開キーを配布し、プログラムに送信するコマンドに秘密キーで署名します。クライアントプログラムは通常どおりリクエストを受信し、GnuPGへの1回の呼び出しでリクエストの信頼性を確認するだけで済みます。

于 2011-12-20T12:54:55.813 に答える
4

これには、 HOTPRFC 4226 )と呼ばれる標準がすでに存在します。それは私たちよりも暗号化の経験が豊富な人々によって精査されているので、車輪の再発明ではなく、それを使用する必要があります。

あなたはあなたの敵が誰であるかを述べていません。彼らが自分のマシンのユーザーである場合、あなたが発明したいスキームを彼らが危険にさらすことを防ぐことは文字通り不可能であることを心に留めておくべきです。

于 2011-12-21T03:58:43.180 に答える