abstimm-id/index.html

91 lines
7.8 KiB
HTML

<!doctype html>
<html lang="en" style="min-height: 100%;">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Abstimm-ID Rechner</title>
<link rel="stylesheet" href="bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z">
<link rel="icon" href="https://blog.netzbegruenung.de/files/2017/04/favicon_32.png" type="image/png" />
<link rel="shortcut icon" href="https://blog.netzbegruenung.de/files/2017/04/favicon_32.png" type="image/png" />
</head>
<body style="background: #fff;">
<script>
function calculate_hash() {
document.getElementById("hash_target").innerHTML = "Berechne, bitte warten ...";
setTimeout(function() {
argon2.hash({
pass: document.getElementById("input_name").value.toLowerCase(),
salt: "Abstimmung " + String(document.getElementById("vote-round").value),
time: 5,
mem: 262144,
hashLen: 16,
parallelism: 1,
type: argon2.ArgonType.Argon2id
}).then(function(h){
document.getElementById("hash_target").innerHTML = "<p class='font-weight-bold'>Abstimm-ID:</p><code>" + String(h.hashHex) + "</code>";
}).catch(e => console.error(e.message, e.code));
}, 5);
}
</script>
<main role="main" class="container mt-5" style="max-width: 700px;">
<div class="text-center p-5">
<div class="p-2"><h1>Abstimm-Prüfsummen Rechner</h1></div>
</div>
<div class="justify-content-center px-5 py-2">
<div class="input-group py-2">
<div class=input-group-prepend>
<label class="input-group-text" for="vote-round">Abstimmung</label>
</div>
<input type="number" id="vote-round" class="form-control" min=1 size=4 value=1>
</div>
<div class="input-group py-2">
<input type="text" class="form-control" placeholder="Grünes Netz Login" id="input_name">
<div class="input-group-append">
<button class="btn btn-success" type="button" onclick="calculate_hash();">Berechnen</button>
</div>
</div>
</div>
<div class="justify-content-center p-5">
<div class="p-2" id="hash_target"></div>
</div>
<div class="p-3">
<h3>Wie verfiziere ich ein Abstimmungs-Ergebnis?</h3>
<p>Das unten beschriebene Verfahren ist gültig, sofern eine Veranstaltung im Abstimmungsgrün Prüfsummen zur Anzeige von Abstimmungsergebnissen einsetzt. Damit das Verfahren funktioniert, muss die Veranstaltung dafür zunächst freigeschaltet werden.</p>
<ol>
<li>Melde dich bei der <a href="https://wolke.netzbegruenung.de">Wolke</a> an, öffne anschließend den Kreis <a href="https://wolke.netzbegruenung.de/apps/circles#ec656aecbcb040">NB-Abstimmungen</a>. Klicke rechts oben auf <img src="join.png"> (<i>Diesem Kreis beitreten</i>).</li>
<li>Du kannst nun den Ordner <a href="https://wolke.netzbegruenung.de/apps/files/?dir=/Abstimmergebnisse&fileid=29340550">Abstimmergebnisse</a> öffnen. Darin befinden sich die Ergebnis-Dateien der letzten Abstimmungen, sortiert nach Datum, Veranstaltungsname und Abstimmungsrunde.</li>
<li>Du kannst die Ergebnis-Datei direkt in der Wolke öffnen oder herunterladen. Sie enthält eine Liste aller abgegebenen Stimmen, inklusive des Abstimmverhaltens (<i>dafür</i>, <i>dagegen</i>, <i>enthalten</i>, etc.). Allerdings enthält die Liste zum Schutz der persönlichen Daten keine Namen, sondern nur <i>Codes</i>, hinter denen sich Personen verbergen. Einen solchen Code nennen wir <i>Prüfsumme</i>. In jeder Abstimmung bekommt jede Person eine neue Prüfsumme.</li>
<li>Mit der vollständigen Liste aller abgegebenen Stimmen kannst du beispielsweise mit <i>LibreOffice Calc</i> oder <i>Microsoft Excel</i> nachrechnen, ob das Gesamtergebnis stimmt.</li>
<li>Um stichprobenartig zu prüfen, ob die Stimme einer Person korrekt enthalten ist, musst du zunächst die Person fragen, wie sie abgestimmt hat.</li>
<li>Gib das Grüne-Netz-Login der Person oben ein, wähle die Abstimmungsrunde und dann <i>Berechnen</i> aus. Dein Computer wird einen Moment benötigen, um die Prüfsumme zu errechnen.</li>
<li>Nach Errechnung der Prüfsumme kannst du in der Ergebnis-Datei mit der Suchfunktion deines Editors suchen. Damit siehst du dann, ob die Stimme der Person korrekt in der Liste enthalten ist.</li>
</ol>
Bitte beachte, dass du keine Liste mit Namen oder Logins veröffentlichen oder Dritten weitergeben darfst. Reklamationen des Ergebnisses können nur beachtet werden, wenn die Ergebnis-Datei nicht geändert und gespeichert wurde.
</div>
<div class="p-3">
<h3>Es ist sehr aufwändig, alle Namen/Logins zu prüfen. Wie kann ich dem Ergebnis trauen?</h3>
<p>Es ist relativ leicht zu prüfen, ob alle Personen die gleiche Datei erhalten haben. Dazu können die Dateien beispielsweise untereinander ausgetauscht oder Prüfsummen verglichen werden. Die Validierung des Ergebnisses wird somit - wie bei klassischen Abstimmungen mit Urnen auch - Aufgabe der beteiligten Personen. Wenn jede Person die eigene und mindestens eine weitere zufällige Stimme prüft, sowie die Ergebnislisten untereinander abgeglichen werden, wird es sehr schwer, das Ergebnis zu manipulieren. Insofern ist es theoretisch für die Integrität des Ergebnisses egal, ob der Abstimmungsserver manipuliert ist.</p>
</div>
<div class="p-3">
<h3>Wie kann das Ergebnis manipuliert werden?</h3>
<p>Bei sehr knappen Abstimmergebnissen wäre es möglich, dass eine Angreifer*in einige wenige Stimmen manipuliert. Wenn nicht alle Beteiligten die Stimmen prüfen, könnten einzelne manipulierte Stimmen unentdeckt bleiben. Je eindeutiger das Abstimmungsergebnis ist, desto schwieriger wird es, das Gesamtergebnis zu manipulieren. Umgekehrt bedeutet das: Je knapper das Ergebnis, desto mehr Stimmen sollte man persönlich validieren.</p>
</div>
<div class="p-3">
<h3>Woher kann ich wissen, dass dieser Rechner keine manipulierte Prüfsumme ausgibt?</h3>
<p>Die Berechnung der Prüfsumme erfolg im Browser - es findet keine Kommunikation mit dem Server statt. Der Quellcode für den Rechner ist Open Source (Link unten). Außerdem ist die Berechnung der Prüfsumme ein standardisiertes Verfahren und kann auch mit anderen Programmen nachvollzogen werden. Das eingesetzte Verfahren heißt <a href="https://de.wikipedia.org/wiki/Argon2">Argon2</a>, die notwendigen Parameter finden sich in der <a href="https://git.verdigado.com/NB-Public/abstimm-id#user-content-argon2-parameter">Dokumentation</a>.
</div>
<div class="p-3">
<h3>Warum dauert das Berechnen einer Prüfsumme so lange?</h3>
<p>Die Rechenzeit für die Prüfsummes ist sehr hoch angesetzt. Auf neuen Geräten dauert es ungefähr 10 Sekunden, auf älteren Geräten kann es allerdings Minuten brauchen. Ziel ist es, das Ausprobieren vieler Logins mit einem hohen technischen und damit finanziellen Aufwand zu verbinden. Könnte man in Bruchteilen einer Sekunde hunderte oder tausende Logins ausprobieren, wäre es sehr leicht, alle Personen zu deanonymisieren.</p>
</div>
</main>
<footer class="footer font-small special-color-dark pt-4 pb-4 text-center mt-5" style="background-color: #f5f5f5;">
<div class="container">
<span class="text-muted"><a href="https://git.netzbegruenung.de/NB-Public/abstimm-id/">Quellcode</a> &mdash; <a href="https://blog.netzbegruenung.de/impressum/">Impressum</a></span>
</div>
</footer>
<script src="node_modules/argon2-browser/lib/argon2.js" integrity="sha384-Z86p2Vj2/KfDVUq4dbOvqv+BH37O7bui9MZj38/J7SBN9YBeJNoWVzmq7NdtLmAb"></script>
</body>
</html>