2011-08-16 4 views
12

내 응용 프로그램에 피드백 메커니즘을 구현하고 싶습니다. 기본적으로 점수입니다.익명의 변경 가능하고 안전한 투표 알고리즘이 있습니까?

  1. 총이 존재하고,
  2. 사용자는 두 번째 점수를 추가 할 수 없습니다 총
  3. 에 사용자를 자신의 점수를 추가 할 수 있지만 업데이트 다시 그의 원래의 점수를 바꿀 수 읽을 수 있습니다 : 요구 사항은 원래 점수를 제거 (빼기) 한 다음 새 점수를 추가하여 합계를 계산합니다.
  4. 는 특정 사용자의 투표이 암호 이론에 대한 경계 (또는 중복) 것 같다,하지만 난이 문제를 해결 할 수있는 모든 작업을 찾을 수 없어

무엇인지를 결정하는 것은 불가능합니다. 누구든지이 문제를 해결할 수있는 특정 알고리즘이 있습니까? 또는 그것을 추구하기 위해 사용할 수있는 추가 검색 벡터도 있습니까?

+1

분산 시스템이라고 생각하십니까? 신뢰할 수있는 단일 당사자가있는 경우 (예 : 실행중인 웹 사이트), 이는 구현하기가 쉽지 않습니다. 시스템의 매개 변수를 더 잘 정의해야합니다. –

+0

이 질문은 아마도 [cryptography stackexchange] (http://crypto.stackexchange.com/)에 더 적합 할 것입니다. – Wyzard

답변

3

사용자가 제공하는 값의 해시와 같은 익명 ID가있는 경우 동일한 해시를 산출하는 사람을 생산할 수있는 사람은 누구나 해당 투표를 수정할 수 있습니다.

해시가 원본을 표시하지 않기 때문에 이러한 의미에서 익명 성이 유지됩니다. Listing (userName, vote), list (hashValue, vote) 대신에. hashValue를 추적하는 것이 여러 폴을 통해 추적 할 수 있다는 우려가있는 경우 공개적으로 공개되지 않는 해시에 대한 추가 폴 특정 배치를 인코딩합니다. 또는 사용자가 해시 할 문자열에이를 삽입 (예 : 앞에 추가)하여 고유 한 제출을 생성하도록 할 수 있습니다.

2

익명의 개인이 두 번 투표하지 않을 것이라는 신뢰를하지 않으면 익명 투표를 할 수 없습니다. 정의에 따르면 진정한 익명 성은 중복 된 투표를 결코 감지 할 수 없다는 것을 보장합니다.

대신 사용자가 자신을 식별하도록 강요하면 중복 투표를 방지하고 투표 컨텍스트 내에서 익명 성을 제공하는 투표 시스템을 구현할 수 있습니다. 다음은 간단한 알고리즘입니다.

  1. 사용자가 로그인합니다. 사용자가 여러 사용자 계정을 얻지 못하게하려면 시스템에 로그인해야합니다.
  2. 사용자 (익명 아님)가 투표 할 문제를 선택합니다.
  3. 사용자 (익명 아님)가 표를 던집니다.
  4. 시스템에 다음이 저장됩니다.
    • 사용자가 선택한 문제에 대해 투표를했다는 표시입니다. 이렇게하면 중복 투표가 방지됩니다.
    • 사용자의 가치가 선택한 문제에 투표합니다 (언급 한 점수입니다). 이 값은 투표를 한 사용자에게 참조하지 않고 저장됩니다.
    • 사용자가 득표 한 경우 점수입니다. 당신은 아마 다음 unvote가 (당신의 시스템이이 저장 때문에 그들이 투표를 알고), 그들은 로그인, 문제를 선택, 사용자가 자신의 투표를 변경하고자 할 경우 계산 된 값을

을 수 있도록이 필요합니다. 이 시점에서 그들은 문제를 다시 선택할 수 있습니다 (투표 표시가 지워짐).

시스템은 사용자가 투표를 취소 할 때 문제에 대한 투표에서 사용자의 투표 값을 뺄 필요가 있습니다.

+0

진정한 익명 성이 중복 투표를 결코 감지 할 수 없다는 것을 어떻게 보장합니까? 사람이 투표했는지를 알아야 할 것이므로 첫 번째 투표가 진행되면 투표가 무엇인지 알 수 있습니까? – cmreigrut

+1

누군가가 진정으로 익명이면 그 개인이 2 개 이상의 익명 계정을 가지고 있지 않다는 것을 알 수있는 방법이 없습니다. – DwB

+0

설명 된 시스템에서 사용자가 투표를 취소 할 때 사용자 투표를 집계에서 어떻게 뺍니까? 원래 투표가 무엇인지 알고 있어야 익명 성이 깨졌습니다. 당신의 포인트 4.3이 그것을위한 것이고 "계산 된"값은 그것이 왜곡되었지만 (여전히 가역적이라면), 소스 코드 (Ruby, Python) 나 디 컴파일러 (Java, .NET)에 접근 할 수있는 누구나 그것을 다시 추적 할 수 있습니다 . 그렇지 않으면, "unvoting"기능을 사용하지 않아도 응답 중에 시스템 만 사용할 수 있습니다. –

1

합법적 인 투표에 대한 충분한 정보를 제공하지는 않지만, 정수라고하면 합계를 유지하고 여러 장의 투표를 허용 할 수 있습니다. 이것은 A에서 B 로의 투표 변경이 A 투표와 투표 (B - A)와 완전히 동일한 효과를 가지기 때문에 가능합니다.

0

실제로 온라인 투표는 매우 까다 롭습니다.

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

그것은 각각 분리 할 수 ​​없습니다 n은 서로 다른 서버들 사이에서 투표의 비밀을 배포하는 알고리즘입니다 : 당신이 투표의 안전에 가장 극단적 인 방법을 원하는 경우에

,이 같은 것을 고려해야 할 수도 익명 투표를하는 것. 익명 성을 없애기 위해 모든 n 개의 서버가 협력해야하며, 서버 중 하나만이 해당 트랙을 덮으면 모든 암호화 데이터를 지워 버리고 투표 비밀은 영원히 사라지거나 숨겨집니다.

또한 온라인 투표에 대한 보안 시스템에 내재 된 몇 가지 제한 사항, 투표의 재 전송을 처리 할 수있는 시스템 : 투표 보안을 위해

온라인으로 항상 궁극적 인 제한이 있다는 점에서이 트래픽 분석에 취약 . 예를 들어 하루에 한 사람 만 투표하면 투표 결과를 업데이트 한 사람이 투표 한 결과라고 결론 지을 수 있습니다.

완벽한 안전한 온라인 투표 시스템은 일회성 투표 - 믹서로 간주되어야합니다. 다수의 표가 필요합니다. 버퍼를 채우고 투표가 마침내 닫히면 한 번에 모든 것을 섞습니다. 투표자를 유권자와 연관시키는 것은 매우 어렵습니다. 이것은 꽤 탄탄한 기술로 성취 될 수 있습니다.

그러나 투표를 업데이트하려면 일이 훨씬 까다로워집니다. 트래픽 분석의 가능성을 피하려면 동기화가 필요합니다. 이상적으로 모든 유권자는 업데이트가 실제로 업데이트가 아니더라도 정기적으로 업데이트를 다시 보내야합니다.

+0

사람들이 그것을 채택하기를 원한다면 출판되고 비판 받아야합니다. – Emre