2013-05-04 3 views
5

私は実験のためのウェブサイトを設計しています。ユーザのボタンをクリックする必要があります。しばらくの間はクリックしてから離してから、クライアントはAJAXイベントをサーバに送信します。実行時間はかかりますが、検証は簡単ですか?

しかし、オートクローンボットや高速スパムを防ぐために、私はホールドタイムを非常にリアルにし、スキップすることはできません。いくつかの計算をしています。ポイントは、実際のCPU時間を無駄にすることです。そのため、AJAXコールバック値を推測したり、システムクロックを高速化してバイパスすることはできません。

  1. サーバー
  2. 挑戦を生成することは容易に高速&は、クライアント側で何の偽装を実行したり、時間をショートカットするためにいくつかの時間がかかる任意のアルゴリズムがあります。
  3. easy & fastを確認するレスポンスサーバにはありますか?
+1

単純なハッシュを強要するのはどうでしょうか?ランダムな値のサーバー側を生成し、ハッシュしてクライアントに渡します。 – user1937198

+0

または、因数分解に時間がかかるように十分大きい大きな整数を因数分解します。 –

答えて

12

あなたはProof-of-work systemを探しています。

最も一般的なアルゴリズムは、とりわけビットコインに使用されるHashcashWikipedia)でもあるようです。基本的な考え方は、クライアントプログラムに先行ゼロの特定の数のハッシュを見つけるように要求することです。これは、ブルートフォースで解決しなければならない問題です。

基本的には、このように動作します。クライアントにはある種のトークンがあります。電子メールの場合、これは通常、受信者の電子メールアドレスと今日の日付です。だから、次のようになります。

[email protected]:04102011 

クライアントは今、この目の前に置くために、ランダムな文字列を検索することがあります。このハッシュは、大手0の束を持っている

[email protected]:04202011 

ように。

次に、このランダムな入力を受け取り、という単一のハッシュを実行して、それが始まるかどうかを確認するだけで済みます0の束。これは、非常にの高速動作です。

クライアントクライアントが正しいハッシュを見つけるのにかなりのCPU時間を費やさなければならないのは、それがブルートフォース問題であるということです。唯一のことは、ランダムな文字列を選択してテストし、それが機能しない場合は別の文字列を選択することです。

もちろん、メールを送信していないので、メールアドレスと日付ではなく、別のトークンを使用したいと思うでしょう。しかし、あなたの場合は、これは簡単です。サーバ側のランダムな文字列を作成し、それをクライアントに渡すだけです。

この特定のアルゴリズムの利点の1つは、難易度を調整するのが非常に簡単です。必要な先行ゼロの数を変更するだけです。必要なゼロが増えるほど、クライアントの所要時間は長くなります。ただし、検証にはまだ時間がかかります。

+0

私の知らないことを許していますが、クライアントにチャレンジを送信する前に、私はサーバーが既に新しい正解を推測しています。クライアントが計算とアップロードを完了した後、サーバーは単に正しい答えと一致しますか?私の手順の理解は正しいのですか? – est

+1

@est:いいえ。考えられるのは、正しいハッシュを確認するのが簡単だということです。正しいゼロ数で始まりますか?クライアントは、電子メールアドレスと日付のような事前定義されたトークンと乱数を使用して、必要な数のゼロを持つハッシュを生成する文字列を見つけなければなりません。 –

+0

ありがとう、もう1つの質問:クライアントがランダムに先行ゼロと後ろにいくつかの迷惑ストリングを入れ、正解と一致する可能性は何ですか? – est

関連する問題