Sicherheitsstufe

Was ist die Sicherheitsstufe?

Die Sicherheitsstufe ist eine Abwandlung von Hashcash und wie dieser die Anzahl der führenden Nullen einer 160-stelligen Binärzahl (Byte-Reihenfolge Big Endian, Bit-Reihenfolge Little Endian), die sich aus einem SHA1-Hash ergibt. Dieser wird bei TeamSpeak aus deinem Public-Key gefolgt von einem String(!) einer vorzeichenlosen 64-Bit-Zahl gebildet. (Danke an Splamy für diese Information.)

Den Public-Key kannst du mit einem Debugger deiner Wahl – ich nehme Cheat Engine (Hinweis: Installation von Adware ausschalten) – auslesen, indem du zu einem Server verbindest und dann nach dem String „omega=“ suchst. Bei Cheat Engine klickt man dann links auf eines der Ergebnisse und drückt Strg+B. Kopiere den Inhalt bis zum nächsten Leerzeichen und entferne alle Backslashes. Die Länge des Public-Keys ist übrigens nicht fix. Der SHA1 ohne die 64-Bit-Zahl heißt in Base64-Darstellung globale ID und in Hex-Darstellung mit den Zeichen [a-p] (statt [0-9a-f]) Avatar-Dateiname. Deine aktuelle 64-Bit-Zahl erhältst du, indem du deine Identität exportierst und die Zahl zwischen identity=" und V kopierst.

Beispiel

Mit Cheat Engine finde ich meinen Public Key: clientinitiv alpha=GNENujWpmAYj6g== omega=ME0DAgcAAgEgAiEA4iZ+x2qXdEVc4OZHkq\/SAAGPiwVHZkiceBiUz5DIkGoCIQDbHwBxnmr2CwxJwQHZ8UJFddzpAf7lc9XINZ44j4vRMA== ot=1 ip=31.172.95.122

Beim Exportieren meiner Identität erhalte ich:
identity="11986550VPe82dZa++6wuky46eShWKIossfB usw. (das ist vertraulich)

Also muss ich den SHA1 von folgendem Text bilden: ME0DAgcAAgEgAiEA4iZ+x2qXdEVc4OZHkq/SAAGPiwVHZkiceBiUz5DIkGoCIQDbHwBxnmr2CwxJwQHZ8UJFddzpAf7lc9XINZ44j4vRMA==11986550

Das Ergebnis ist 00000078CF7B0D979B23ACFF9119B7A5A512D46B und entspricht binär:
00000000 00000000 00000000 01111000 11001111 01111011 00001101 10010111 10011011 00100011 10101100 11111111 10010001 00011001 10110111 10100101 10100101 00010010 11010100 01101011 Unter Beachtung der oben genannten Byte- und Bit-Reihenfolge erkennen wir 27 führende Nullen und somit die Sicherheitsstufe 27.

Nach Erhöhen meiner Sicherheitsstufe erhalte ich mit 323710685 den SHA1 00000010822F3E8FDB7980F5D5D54F8DF9952906 und das entspricht binär: 00000000 00000000 00000000 00010000 10000010 00101111 00111110 10001111 11011011 01111001 10000000 11110101 11010101 11010101 01001111 10001101 11111001 10010101 00101001 00000110 Man erkennt hier die Sicherheitsstufe 28.

Durch die Gleichverteilung von SHA1 erhält man beim Erhöhen der Sicherheitsstufe mit der Wahrscheinlichkeit P(k)=0,51+k allerdings genau k Stufen mehr, als man eigentlich wollte. Wäre im zweiten Beispiel die 1 vor dem zweiten roten Bereich nicht, hätte ich k=5 Stufen mehr erhalten, als ich eigentlich wollte, die Chance dafür ist 1,5625%. Aber ich habe die Anzahl an Sicherheitsstufen erhalten, die ich wollte (k=0), wofür die Chance 50% beträgt.

Wie lange dauert das?

Die Dauer der Erhöhung der Sicherheitsstufe wächst exponentiell, die Generierung der nächsten Stufe dauert also etwa so lange wie alle Sicherheitsstufen bis dahin und doppelt so lange wie der Weg von der letzten zur aktuellen Stufe.

TeamSpeak gibt in den Server-Einstellungen folgende Einschätzung an:

Das wurde 2009 geschrieben und bis 2017 nicht verändert. Die 2015 verkauften Haswell-Prozessoren sind etwa viermal schneller.

Als Abschätzung kann man sagen, dass man durchschnittlich 2k Hashes benötigt, um Stufe k von Stufe 0 aus zu erreichen. Warum das so ist, kann man sich bei k=1 gut klarmachen: Zu 50% haben wir beim ersten Versuch Stufe 1 erreicht, zu 50% nicht. Zu 25% haben wir beim genau zweiten Versuch Stufe 1 erreicht, denn wir haben zu 50% beim ersten Versuch versagt und zu 50% beim zweiten Versuch Erfolg, macht als Produkt 25%. Das geht immer so weiter. Es ergibt sich eine unendliche Reihe mit dem Wert 2.

Geht das nicht schneller?

Ja. TeamSpeak benutzt kein Multhreading und auch sonst ist die Implementierung nicht sehr effizient.

Ich habe ein kleines Programm geschrieben, das die Windows-Methoden in advapi32.dll dafür verwendet. Auf einem Kern eines i5-4690 oder i7-4720HQ berechne ich so etwa 5 MH/s, TeamSpeak schafft etwa ein Fünftel. Eine Implementierung in OpenCL oder Cuda wäre natürlich schneller, aber da bin ich kein Experte und entsprechende Tools wie Hashcat, John the Ripper und Hash Suite können keine SHA1-Teilkollisionen suchen oder ohne ein konkretes Ziel Hashes ausgeben, die man mit grep oder so filtern könnte. Eine Nvidia GTX 1080 schafft in Hashcat beispielsweise etwa 8,5 GH/s, übersteigt die Performance von TeamSpeak also um 850.000% und benötigt für Sicherheitsstufe 33 (von 8, also vernachlässigbar, aus) genau eine Sekunde. So, genug geträumt, geht ja wie gesagt nicht.

Mein Programm ist bei aktuellen Prozessoren dank Multithreading immerhin etwa 20 bis 30 mal schneller als TeamSpeak. Zum Multithreading werden die Threads gestartet, die sich jeweils ein Paket von 1 Millionen Hashes nehmen, wenn sie gestartet werden oder mit einem Paket fertig sind.

Verwendung

Zunächst einmal brauchst du deinen Public-Key. Wie du den erhältst, steht oben. Den fügst du im Programm ein. Überschüssige Backslashes werden automatisch entfernt. Wenn alles richtig funktioniert hat, steht deine globale ID im Programm.

Speichere exportiere anschließend deine Indentität (Rechtsklick auf die Identität) und öffne die Datei.

Optional: Wenn du schon eine nennenswerte Sicherheitsstufe hast, nehme deine Zahl aus der Identitätendatei, teile sie durch 1 Millionen, runde ab und schreibe sie in das „Iteriere von“-Feld.

Und das „Iteriere bis“-Feld schreibst du eine große Zahl. Das Maximum ist gut 2 Milliarden (2147483647), also eine 64-Bit-Zahl von gut 2 Billiarden (2147483646999999).

Stelle noch deine gewünschte Sicherheitsstufe ein und klicke auf „Starten“.

Rechts im Fenster erscheinen dann Meldungen wie diese:

233304ms: 4945009973 Stufe 34 (000000000C05DB2C0A79554365DB4A78337D8F0C)

Am Anfang steht die Zeit, im Beispiel also knapp 4 Minuten. Dahinter steht die 64-Bit-Zahl, die einen Treffer erzielte. Diese Zahlen sind nicht zwangsläufig fortlaufend, da die Threads sich immer Pakete von 1 Million Hashes nehmen. Danach kommt die tatsächlich erreichte Stufe und zum Beweis der SHA1 mit der angegebenen Anzahl führender Nullen.

Ersetze die Zahl vor dem V in deiner Identität in der Identitätendatei durch die sich ergebene Zahl. Bei mir ist die Zeile dann identity="4945009973VPe82dZa++6wuky46eShWKIossfB usw.

Speichere und importiere abschließend diese Datei.

Trivia

Der Hund im Programmlogo ist übrigens Saber, die Hündin einer Freundin von mir.