TeamSpeak 3 VoIP 通信系统使用所谓的身份概念来向服务器识别客户端。这些身份基本上是公钥/私钥对。
为了防止人们在被禁止后仅仅生成一个新的身份,他们添加了一个称为安全级别的功能。提高安全级别需要成倍增加的 CPU 时间才能达到。
这样,被禁止的用户至少需要花费最少的时间来生成具有所需安全级别的新身份,然后才能再次加入服务器。
现在我的问题:
安全级别是如何实现的,以便改进一个级别的时间可以成倍增加,但在服务器端验证一个级别的时间保持不变(或至少线性增加)?
TeamSpeak 3 VoIP 通信系统使用所谓的身份概念来向服务器识别客户端。这些身份基本上是公钥/私钥对。
为了防止人们在被禁止后仅仅生成一个新的身份,他们添加了一个称为安全级别的功能。提高安全级别需要成倍增加的 CPU 时间才能达到。
这样,被禁止的用户至少需要花费最少的时间来生成具有所需安全级别的新身份,然后才能再次加入服务器。
现在我的问题:
安全级别是如何实现的,以便改进一个级别的时间可以成倍增加,但在服务器端验证一个级别的时间保持不变(或至少线性增加)?
TeamSpeak 身份只是由libtomcrypt 库生成的 NIST 曲线 ECC-256 的 ECC 密钥对,以及一个 64 位无符号整数的计数器值。
安全级别使用经典的工作量证明系统。
让PUBLICKEY
是身份的 ASN.1 DER 编码公钥的 base64 编码字符串。此外,设COUNTER
是 64 位无符号整数的十进制 ASCII 编码。那么安全级别定义如下。
securitylevel := leadingzerobits(sha1(PUBLICKEY || COUNTER))
因此,需要尝试达到安全级别的计数器值的预期数量n
是2^n
(假设 SHA-1 是均匀随机函数)。
请注意,理论上,最大安全级别可能是 160(因为 SHA-1 产生 160 位散列)。然而,TeamSpeak 客户端似乎人为地将限制设置为 128。实际上,这并没有什么区别,因为没有人会达到超过 128 的安全级别(除了攻击 SHA-1 的另一个突破发生)。
来源:TSIdentityTool,它是身份和安全级别机制的开源实现。
使用的方法基于 hashcash。http://en.wikipedia.org/wiki/Hashcash
Hashcash 是一种工作量证明系统,旨在限制电子邮件垃圾邮件和拒绝服务攻击。
我不能确定。但是,如果您正在寻找类似的功能,我将按如下方式实现它:ID 包含私有和公共部分(这就是 Teamspeak 所做的)。所以我想这是你可以自己生成的一些异步加密密钥。
现在只需生成一个数字序列,例如s = [1..n]
并散列它们。
一旦M
生成的哈希的第一位M
与公钥的第一位匹配,您就将其视为安全级别的有效工作证明M
。
您需要n
几轮散列来找到散列,但要证明它,服务器必须只散列s
一次结果并检查有多少位与您的公钥匹配。你的难度将成倍增加。
这实际上类似于比特币所做的。但是比特币试图在散列前获得一定数量的零,你不会散列一个随机数,而是你想要挖掘的块的 b 树加上一个随机数(随机数)。
从 Teamspeak:
生成一个 ID,例如IHoxfrQNl152vs80N4wYvsEmNd8=
导出它以查看机密:例如205VFy/YWQLyDeTxIIQvyy4hGQYxWloFH0R9VW4VRCxQHkcOdFdyX2YHMztQDQQeDA1gNG9Ce0N6CipVHkMie2lzX3ReRX4HFQhqFiB5FBQEEi0DVhhCUltiOE4GcmV2W3FkDX1OdXcrUUxwUUloQVBHRjYvM3EzWCtGeUpkRHlWTTFXZGh1VHJRZVA0Q3hMWE1ITXVxNlU1TTQ=
如果您现在增加安全性,则只更改导出的第一部分。从 8 → 9 → 24 它从205
到247
到520935
。
29147155819
我的最高键在 34 级左右有一些数字。
我认为这个数字会以某种方式散列到与我的公钥相关的东西。所以任何人都可以用一轮散列来证明它,但我的电脑需要29147155819
几轮散列才能找到它,这花了很长时间;)
顺便说一句:最大安全性是 128,所以我猜这是公钥的长度。
我希望我能帮上忙 - Tarion
您基本上可以使用比特币难度之类的东西,并将恰好具有给定前缀的密钥视为有效密钥(例如,以给定数量的“0”开头)。