TeamSpeak Le système de communication VoIP utilise un concept d'identités dites pour identifier le client sur le serveur. Ces identités sont essentiellement des paires de clés publiques/privées.
Afin d'empêcher les gens de simplement générer une nouvelle identité après avoir été, par exemple, interdit, ils ont ajouté une fonctionnalité appelée niveaux de sécurité . L'augmentation des niveaux de sécurité prend exponentiellement plus de temps CPU à atteindre.
De cette façon, un utilisateur banni doit passer au moins un minimum de temps pour générer une nouvelle identité avec le niveau de sécurité requis avant de pouvoir rejoindre à nouveau le serveur.
Maintenant à ma question:
Comment les niveaux de sécurité sont-ils mis en œuvre, de sorte que le temps pour l’améliorer puisse augmenter de façon exponentielle mais que le temps pour en vérifier un côté serveur reste le même (ou au moins augmente juste de façon linéaire)?
Une identité TeamSpeak est simplement une paire de clés ECC pour la courbe NIST ECC-256 générée par la bibliothèque libtomcrypt , ainsi qu'une valeur de compteur qui est un entier non signé 64 bits.
Le niveau de sécurité utilise un système de preuve de travail classique.
Soit PUBLICKEY
la chaîne codée en base64 de la clé publique codée ASN.1 DER de l'identité. De plus, soit COUNTER
le codage ASCII décimal d'un entier non signé 64 bits. Ensuite, le niveau de sécurité est défini comme suit.
securitylevel := leadingzerobits(sha1(PUBLICKEY || COUNTER))
Par conséquent, le nombre attendu de valeurs de compteur qui doivent être essayées pour atteindre le niveau de sécurité n
est 2^n
(sous l'hypothèse que SHA-1 est une fonction aléatoire uniforme).
Notez qu'en théorie, le niveau de sécurité maximal pourrait être de 160 (car SHA-1 produit un hachage de 160 bits). Cependant, le client TeamSpeak semble fixer artificiellement la limite à 128. En pratique, cela ne fait aucune différence, car personne n'atteindra jamais un niveau de sécurité supérieur à 128 (sauf une autre percée dans l'attaque de SHA-1).
Source: TSIdentityTool , qui est une implémentation open source des mécanismes de niveau d'identité et de sécurité.
La méthode utilisée est basée sur le hashcash. http://en.wikipedia.org/wiki/Hashcash
Hashcash est un système de preuve de travail conçu pour limiter le spam par e-mail et les attaques par déni de service.
Je ne peux pas dire avec certitude. Mais si vous recherchez une fonctionnalité similaire, je l'implémenterais comme suit: Un ID contient une partie privée et publique (c'est ce que fait Teamspeak). Je suppose donc que vous pouvez générer vous-même une clé de cryptage asnyc.
Générez maintenant simplement une séquence de nombres, par exemple s = [1..n]
et les hacher.
Dès que les premiers M
bits du hachage généré correspondent aux premiers M
bits de la clé publique, vous le prenez comme un prof de travail valide pour le niveau de sécurité de M
.
Vous avez eu besoin de n
tours de hachage pour trouver le hachage, mais pour en tirer profit, le serveur ne doit hacher le résultat s
qu'une seule fois et vérifier le nombre de bits correspondant à votre clé publique. La difficulté pour vous augmentera de façon exponentielle.
C'est en fait similaire à ce que fait Bitcoin. Mais Bitcoin essaie d'obtenir un certain nombre de zéros devant le hachage et vous ne hachez pas un nombre aléatoire, mais l'arbre b du bloc que vous souhaitez extraire plus un nonce (nombre aléatoire).
De Teamspeak: Générez un ID par exemple IHoxfrQNl152vs80N4wYvsEmNd8=
Exportez-le pour voir le secret: par exemple 205VFy/YWQLyDeTxIIQvyy4hGQYxWloFH0R9VW4VRCxQHkcOdFdyX2YHMztQDQQeDA1gNG9Ce0N6CipVHkMie2lzX3ReRX4HFQhqFiB5FBQEEi0DVhhCUltiOE4GcmV2W3FkDX1OdXcrUUxwUUloQVBHRjYvM3EzWCtGeUpkRHlWTTFXZGh1VHJRZVA0Q3hMWE1ITXVxNlU1TTQ=
Si vous augmentez maintenant la sécurité, seule la première partie des modifications d'exportation. De 8 → 9 → 24, il obtient de 205
à 247
à 520935
.
Ma clé la plus élevée a un certain nombre autour de 29147155819
au niveau 34.
Je pense que ce nombre sera en quelque sorte haché à quelque chose qui est lié à ma clé publique. Donc, tout le monde peut le prouver avec un seul tour de hachage, mais mon PC avait besoin de 29147155819
tours de hachage pour le trouver, ce qui a pris un certain temps;)
Btw: La sécurité maximale est de 128, donc je suppose que c'est la longueur en bits de la clé publique.
J'espère avoir pu aider - Tarion
Vous pouvez essentiellement utiliser quelque chose comme la difficulté Bitcoin et considérer comme valides uniquement les clés qui ont un préfixe donné (commence par un nombre donné de '0' par exemple).