2011-08-16 5 views
12

私はアプリケーションにフィードバックメカニズムを実装したいと思います。基本的にスコアです。要件は次のとおりです。匿名の変更可能な安全な投票のアルゴリズムはありますか?

  1. 合計が存在し、ユーザーが総
  2. を自分のスコアを追加することができ、ユーザが第二のスコアを追加することはできませんが、彼のオリジナルのスコアを変更することができ、再び更新
  3. を読み取ることができます元のスコアを削除(減算)して新しいスコアを追加します。
  4. 特定のユーザーの投票は、暗号理論上の国境(あるいは重なっている)ようですが、私はこの問題に対処するだろう何かを見つけることができませんでした

何であったかを判断することは不可能です。誰かがこれに対処する特定のアルゴリズムを持っていますか?あるいは私がそれを追求するのに使うことができる追加の検索ベクトルさえ?

+1

これは分散システムであるはずですか?単一の信頼関係者(実行しているWebサイトなど)がある場合、これは実装するのが簡単です。システムのパラメータをよりよく定義する必要があります。 –

+0

この質問はおそらく[暗号化スタックエクスチェンジ](http://crypto.stackexchange.com/)に適しています。 – Wyzard

答えて

3

ユーザーが提供する値のハッシュなどの匿名IDがある場合、同じハッシュを生成するものを作成できるユーザーは、対応する投票を変更できます。

ハッシュがソースを明らかにしないので、この意味ではまだ匿名性があります。リスト(userName、vote)、list(hashValue、vote)の代わりに。 hashValueを追跡することが多くのポーリングで追跡可能であるという懸念がある場合、パブリックに公開されていないハッシュの追加のポーリング固有のラッピングをエンコードします。または、ユーザーにハッシュされる文字列にその文字列を埋め込む(たとえば、前に付ける)ようにしてください。

2

匿名の人が2度投票しないことを信じる能力がない限り、匿名の投票は決してできません。定義上、真の匿名性により、重複した投票は決して検出できないことが保証されます。

代わりにユーザーに自分を識別させる場合は、重複した投票を防止し、投票のコンテキスト内で匿名性を提供する投票システムを実装できます。 ここには簡単なアルゴリズムがあります。

  1. ユーザーがログインします。ユーザーが複数のユーザーアカウントを取得できないようにするため、システムにはシステム管理者権限があります。
  2. ユーザー(匿名ではない)が投票する問題を選択します。
  3. ユーザー(匿名ではない)が投票を行います。
  4. システムには次の情報が格納されています。
    • ユーザーが選択した問題に投票したことを示します。これにより、重複した投票が防止されます。
    • ユーザーの価値が、選択した問題に投票しました(これはあなたが言及したスコアです)。この値は投票を行ったユーザーを参照せずに保存されます。
    • 問題に投票したユーザーのスコアの値。あなたは、おそらく(それは、これを保存しているため、あなたのシステムは、彼らが投票を知っている)unvote、その後、問題を選択し、ユーザーは、彼らがログインし、自分の投票を変更したい場合は、これは

計算値である必要があります。この時点で、彼らは問題を再度選ぶことができ(投票の表示がクリアされ)、投票することができます。

あなたのシステムでは、投票していないときに問題の集計からユーザーの投票値を差し引く必要があります。

+0

真の匿名性により重複した投票を検出することは絶対にできないことはどうですか?人が投票したかどうかを知る必要があるのでしょうか?そのため、最初の投票が投げられたときに、投票が何であったかを知ることができますか? – cmreigrut

+1

誰かが本当に匿名の場合、その個人が2つ以上の匿名アカウントを持っていないことを知る方法はありません。 – DwB

+0

あなたが説明したシステムでは、投票していないときにユーザーの投票を集計からどのように差し引いていますか?元の投票が何であったのかを知る必要があります。これは匿名性を破ります。あなたのポイント4.3がそのためのもので、 "計算された"値は、それが文字化けしている(しかし、まだ可逆である)ことを意味するなら、ソースコード(Ruby、Python)または逆コンパイラ(Java、.Net) 。さもなければ、あなたのシステムは回答の中でここで使用できる唯一のものです。 –

1

あなたは正当な投票について十分な情報を提供していませんが、例えば整数であれば、合計を保持して複数の投票を許可することができます。これは、AからBへの投票の変更がAの投票と投票(B - A)と全く同じ効果を持つためです。

0

実際、オンライン投票はかなり難しいです。

あなたが投票の安全性への最も極端なアプローチをしたい場合、あなたはこのような何かを検討する必要がある場合があります

https://docs.google.com/document/d/1SPYFAkVNjqDP4HOt_A_YGFZy-SFXVxHoN1hpLGNFKXI/pub

それは、それぞれが壊すことができないn個の異なるサーバ間での投票の秘密を配布するアルゴリズムです。投票匿名性匿名性を壊すためには、n台のサーバーすべてが協力しなければならず、サーバーの1つだけがそのトラックをカバーすれば、すべての暗号化データが消去され、投票秘密は永遠に失われ/隠されます。

システムは、オンライン投票のための任意の安全なシステムに固有のいくつかの制限で、票の再送信を扱うことができます。

議決セキュリティを確保するためには、オンラインでは、トラフィック解析に対して脆弱であることを究極的な制約では常にあります。例えば、1日に1人だけ投票すれば、投票結果の更新はその投票者の結果であると結論付けることができる。

完璧な安全なオンライン投票システムは、ワンタイム投票ミキサーと見なす必要があります。それは多数の票を取る。それらをバッファリングし、投票が最終的に閉じられると、それらはすべて一挙にミックスされます。投票を投票者に関連付けることは非常に困難です。これは非常に堅実な技術で実現できます。

しかし、投票を更新したいときは、はるかに扱いにくいものになります。トラフィック分析の可能性を避けたい場合は、同期の必要があります。理想的には、すべての有権者は定期的に(たとえ更新が実際に更新ではなくても)定期的に更新を再送信する必要があります。

+0

あなたは人々がそれを採用したい場合は、公開され、批判を受けてくださいしようとする必要があります。 – Emre

関連する問題