安全号码是稳定标识符和用户公钥的派生。为对话中的两个人计算安全号码。
真正重要的代码是这段代码
byte[] publicKey = getLogicalKeyBytes(unsortedIdentityKeys);
byte[] hash = ByteUtil.combine(ByteUtil.shortToByteArray(FINGERPRINT_VERSION), publicKey, stableIdentifier.getBytes());
for (int i=0;i<iterations;i++) {
digest.update(hash);
hash = digest.digest(publicKey);
}
发生的情况是,我们将指纹版本、公钥和稳定标识符作为起始输入,并使用 SHA-512 对其进行哈希处理。第二次迭代将公钥附加到我们刚刚生成的散列中,然后对其进行第二次散列。
这个添加公钥和重复散列的过程将持续指定的迭代次数。
为什么我们需要比过去做更多的迭代?
这是由于散列的一个基本问题。这是哈希冲突的可能性。
假设我是攻击者(夏娃)。Alice 想与 Bob 交谈,因此 Signal 将她的公钥发送给 Bob,但 Eve 截获了公钥并替换了她自己的公钥。通常会显示密钥已更改,并且安全编号已更改。
如果 Eve 有足够的资源,她可以构造一个与安全号码相匹配的公钥。为了对抗这种威胁,我们使 Eve 需要找到在 5200 轮散列后发生的冲突,并且每轮都添加相同的密钥。
这在计算上变得不可行,因为每一轮散列使得线性地寻找碰撞在计算上更加昂贵。当前选择的迭代次数通常是根据感知到的威胁的资源根据这种风格的攻击需要多长时间来计算的。
我无法从 Signal 中找到任何关于他们选择 5200 的具体原因的计算。