2011-12-20 4 views
2

ウェブサイトとそれに対応するヘルパープログラム(ユーザコンピュータにインストールされている)を開発しようとしています。ウェブサイトとプログラムはお互い(AJAXを中心に)コミュニケーションをとりますが、他のウェブページがプログラムにリクエストを送ることができれば大きなセキュリティ上のリスクになります。私は、私のプログラム(ユーザーのコンピュータにインストールされている)に詐欺の要求を注入することを非常に困難にする解決策を考え出したいと思います。私の考えはワンタイムパスワードを使用しようとしていますが、私はセキュリティに関する知識が限られているので、あなたの考えを尋ねます。ワンタイムパスワードアルゴリズム(matematical、time based、action based)

私はこのワンタイムパスワードアルゴリズム(擬似)を思い付いています

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コードとカウンタ値が含まれている場合、これは安全ですか?これを達成するためのヒントは何ですか?私は本当に上記のすべてのプロパティが欲しいです。

ありがとうございます。

+0

[ハッシュチェーン](http://en.wikipedia.org/wiki/hash_chain)や他の標準的な[ワンタイムパスワード](http://en.wikipedia)の生成方法を検討することもできます。 org/wiki/one-time_password)。 OTPを生成するための標準ライブラリをお探しの場合は、[ITセキュリティ](http://security.stackexchange.com/)でお尋ねください。 OTPを生成するために新しいライブラリを作成している場合は、[暗号化](http://crypto.stackexchange.com/)でより具体的な質問を投稿することができます。 –

答えて

6

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

私はSHA256の具体的な欠点を認識していません。しかし、あなたの問題は一般的にはかなり一般的であり、標準的な言葉で記述し解決する方がはるかに簡単です。プログラムへの要求を認証する必要があります。リモートプログラムは、要求の真正性を確実に判断する必要があります。この問題は、公開鍵暗号方式で最も簡単に解決されます。たとえば、GnuPGの鍵ペアを作成し、Webサイトで秘密鍵を保持し、プログラムに公開鍵を配布し、秘密鍵でプログラムに送信するコマンドに署名します。クライアントプログラムは通常はリクエストを受け取り、GnuPGへの一回の呼び出しで真偽を確認するだけです。

4

HOTPRFC 4226)という名前の標準が既にあります。それは、私たちよりも暗号化の経験が豊富な人たちによって審査されてきたので、ホイールを再発明するのではなく、それを使うべきです。

あなたはあなたの敵が誰であるかを明記していません。彼らが自分のマシン上のユーザーであれば、自分が気にしているスキームを妥協することは文字通り不可能であることを覚えておく必要があります。

関連する問題