X-User-ID
Seit Juni 2005 werden X-Trace und NNTP-Posting-Host
verschlüsselt und der verschlüsselte Username als X-User-ID abgelegt.
Die relativ aufwändige Implementierung geht auf den Wunsch von
Roman Racine zurück. Außenstehende sollen nicht ohne weiteres feststellen
können, ob zwei Postings vom selben Autor stammen.
Ende Dezember 2005 weist Thomas Lahn darauf hin, dass laut Abschnitt 3.4.1 von RFC2980 NNTP-Posting-Host zwar optional ist, aber ansonsten einen definiert Wert hat. Seit dem gibt es ein verschlüsseltes X-NNTP-Posting-Host.
Im Juni 2006 wird auf Anregung von J. Schneider die Mindestanzahl an Zufallszeichen (MIN_PADDING) erhöht und von Crypt::RandPasswd::letters auf Crypt::RandPasswd::chars umgestellt.
Contents |
Kollisionen
Symmetrische Verschlüsselung ist im Gegensatz zu einem Hash eindeutig umkehrbar. Hat man zweimal den gleichen Chiffretext vorliegen, dann weiß man, dass zweimal der gleiche Klartext verschlüsselt wurde. Handelt es sich dabei um den Wert von X-User-ID, dann weiß man, dass zwei Postings vom selben Autor stammen.
Um dem entgegen zu wirken, wird der Klartext mit zufälligen Zeichen auf eine runde Länge gestreckt. Dies ist kein garantierter Schutz sondern verringert nur die Wahrscheinlichkeit, zweimal den gleichen Chiffretext zu produzieren. Abhängig ist dies von:
- der Qualität des Zufallsgenerators
- der Länge der Zufallssequenz
- der Anzahl der Verschlüsselungen
Geburtstagsproblem
Nimmt man an, dass der verwendete Zufallsgenerator perfekt gleichverteilt ist, dann hat man ein Geburtstagsproblem.
Wenn der Schlüssel spätestens alle drei Monate gewechselt wird und ein einzelner Benutzer maximal 2000 Postings pro Monat absetzt, ist die Anzahl der Verschlüsselungen 6000 (~ Geburtstagsproblem mit 6000 Personen).
Will man mit einer Wahrscheinlichkeit von 99.9 % ausschließen, dass keine Kollision auftritt (~ niemand am selben Tag Geburtstag hat), ergibt sich daraus die Mindestlänge des Zufallstexts (~ die Anzahl der Tage im Jahr).
Rekursionsformel
Mit dem kleinen Programm auf wikipedia kann man ein verwandtes Problem lösen: Für eine gewünschte Wahrscheinlichkeit und bestimmte Zufallstextlänge errechnet sich die maximale Anzahl der Postings, die mit einem Schlüssel verschickt werden dürfen.
Das Alphabet von Crypt::RandPasswd::chars umfasst 94 Zeichen. Bei einer gewünschten Wahrscheinlichkeit von 99.9 % Prozent ergibt sich folgende Anzahl von Postings:
| Zufallstextlänge | Kombinationen | Postings | |
|---|---|---|---|
| 4 | 94 ^ 4 = 78074896 | 396 | |
| 5 | 94 ^ 5 = 7339040224 | 3833 | |
| 6 | 94 ^ 6 = 689869781056 | 37155 |
Berechnet wurde das mit diesem adaptierten Programm:
#include <stdio.h>
void one_year(long year)
{
int n = 1;
double q = 1;
while (q > 0.999)
{
q *= (year - n + 1) / (double)year;
n++;
}
printf("YEAR=%12ld n=%5d P=%f\n", year, n - 1, 1 - q);
}
int main()
{
one_year(365);
one_year(78074896);
one_year(7339040224);
one_year(689869781056);
return 0;
}
Die Ausgabe:
$ gcc -Wall a.c && ./a.out YEAR= 365 n= 2 P=0.002740 YEAR= 78074896 n= 396 P=0.001001 YEAR= 7339040224 n= 3833 P=0.001000 YEAR=689869781056 n=37155 P=0.001000