5

データベースが侵害された場合 (過度に好奇心旺盛な DB によって「侵害された」ことを含む)、ユーザーに投票を追跡することを不可能にする方法で、登録ユーザーが何らかの機密問題に投票できるようにする、追跡不可能な投票システムを作りたいと考えています。管理者)。

詳細設定:

  1. すべてのユーザーが登録されており、完全に匿名の投票はありません。
  2. ソックパペット、偽のアカウントなどはこの質問の範囲外です。これは登録システムの責任です。
  3. 登録されたすべてのユーザーは 1 票しか投じることができません (単純な「はい/いいえ」や「体重」など、何でもかまいません)。
  4. 投票が終了するまで、ユーザーは自分の投票を変更/削除できる必要があります。
  5. 削除/変更が行われるのと同じ方法で行うことができますが、ユーザーに自分の投票を表示させる必要はありません。
  6. 誰かがユーザー認証データベースと投票データベースにアクセスできる場合でも、各投票を追跡してユーザーに戻すことはできません (ある意味で、ブルートフォースまたはユーザー アカウント全体のアクセスをハッキングするのは簡単であってはなりません)。
  7. 通信を除くシステムのすべての部分が公開されているため、隠しキーは存在しません。MitM 攻撃は問題外ですが、攻撃者はソース、認証、および投票データベースに完全にアクセスできます。
  8. ユーザーは怠惰です。他の投票固有のキーやパスワードは必要ありません。システムは、ユーザーがログインにすでに使用しているものは何でも、通常のログイン/パスワード/キーを除いて、ローカルに提供または保持することをユーザーに要求してはなりません。
  9. 投票の改ざんと、プログラム<->DB通信と追跡不可能性を除くセキュリティの問題は、はるかに広い問題であるため、この質問の範囲外でもあります。

猶予期間後に自分の回答として投稿する解決策がいくつかあります。

4

4 に答える 4

2

DB管理者が投票システムを持つアプリケーションコードにアクセスできないと仮定し、DB管理者が投票を表示することは問題ではないと仮定します(投票を人にリンクするだけです)

ユーザーの投票を保存するテーブルに、投票したユーザーからの情報 (名前、ユーザー名、電子メール、誕生日、それらの組み合わせ) の塩漬けハッシュを含む追加の列を作成します。これは重要なことです。DB 管理者は、DB に格納されているユーザーの一意の値が最初に生成されてから暗号化される方法を知る必要はありません。

思いついたユーザー トークン (名前、電子メール) がパスワードであり、実際のパスワードが何であるかを知らずに DB に格納したいとします。詳細情報はこちら にあります データベースにパスワードを保存する最良の方法

したがって、ユーザーごとのハッシュ/ソルトアルゴリズムを使用すると、ユーザーが投票をキャスト/編集または削除するたびに、最初にハッシュを生成し、次に投票テーブルでそのハッシュ値を持つレコードを見つけて、それに基づいて行動することができますによると。(存在しない場合は挿入し、存在する場合は更新し、ユーザーが必要とする場合は削除します)

投票プロセスが終了したら、その投票プロセスの回答のハッシュ値を破棄することもできるため、投票をユーザーにリンクする方法はありません。

于 2012-06-05T10:44:42.203 に答える
1

追跡不可能な投票をキャスト/変更するときにパスワードを提供するようにユーザーに依頼し、ユーザーの認証情報 (ソルト + 一方向ハッシュ) を 2 回保存するときと同じことを行います。ハッシュされたパスワードを使用し、この特定の のペアに対してランダムに生成したソルトをもう一度使用します{user, poll}。投票を設定または変更するリクエストには、次の要素が含まれている必要があります。

  • ユーザー名
  • 認証ソルト #1 のパスワード ハッシュ #1
  • ポーリング固有のソルト #2 のパスワード ハッシュ #2
  • 投票自体

ユーザー名とハッシュ #1 を使用して、既知のユーザーから投票を得ていることを確認し、投票自体と共にハッシュ #2 をユーザー投票テーブルに保存します。ハッシュ #2 とソルト #2 の値は、投票を一意に識別するために使用されます。

パスワード ハッシュは一方向であるため、平文のパスワードを知っている人だけがハッシュ #2 を生成できます。ソルト #1 がソルト #2 と異なる場合、両方のデータベースを所有している人でさえ、投票を行うユーザーへの接続を確立することはできません。

于 2012-06-05T14:22:13.767 に答える
0

DB にアクセスできる人から隠したいだけの場合は、DB の外部に保存されているキーを使用して対称暗号化を使用します。

それ以外の場合は、すべてのユーザーにシークレットを割り当て、そのシークレットをユーザー ID の代わりに投票と共に保存する必要があります。シークレットは、サーバーによって何らかの方法で署名されている必要がありますが、ユーザーには決して接続されていません。ユーザーはシークレットを使用して後で自分の投票を変更できます。投票は署名されているため検証できますが、投票をユーザーに関連付ける方法はありません (攻撃者がシークレットの割り当てプロセスを監視する方法を持っていない限り)。

余分な秘密でユーザーを困らせたくない場合は、ユーザーが既に持っている唯一のもの、つまりパスワードを使用する必要があります。ユーザー名、パスワード、およびランダム ソルトから作成されたハッシュを使用して、投票のインデックスを作成できます。多くのパスワードは簡単に推測できるため、これは本質的に安全ではありません。厳格なパスワード ポリシーと非常に低速なハッシュ アルゴリズム (bcrpyt など) は、ある程度役立ちます。例)ハッシュを計算するのに数秒かかるように bcrypt の作業係数を設定した場合、それはサーバーで許容されますが、攻撃者が数百万回以上ハッシュを解読しようとする可能性は低く、十分ではない可能性があります。辞書攻撃でも。

于 2012-06-05T10:42:20.173 に答える
0

条件が互いに除外されているため、あなたが望むことは不可能に思えます。

適切なキーを設定するか、セキュリティを侵害します。

于 2012-06-05T10:54:15.787 に答える