“查找冲突是一个棘手的过程,因为它需要您处理嵌入证书中的公钥位(有关更多详细信息,请参阅本文)。此外,Microsoft 可以通过在证书中添加随机序列号来防止这种情况发生。证书,他们没有这样做。”
我的问题是向证书添加随机值如何提高安全性?攻击者不能简单地生成一个序列号来创建 MD5 冲突吗?
更新:
以下是有关Microsoft 如何在 CA 密钥中实现随机化的信息。我不确定每个的优点和缺点。
配置序列号生成
在 Windows 2000 CA 中,会生成两种类型的固定长度序列号。可以修改注册表以生成一种或另一种类型。默认序列号为(从高到低):GetTickCount() 中的 DWORD + USHORT CA 证书索引(从 0 开始)+ DWORD RequestId(10 个字节/20 个十六进制数字)。替代形式是:从注册表派生的一个字节 + 一个 DWORD RequestId + 8 个字节的 CryptGenRandom 输出 + 一个 USHORT CA 证书索引 + 一个 DWORD RequestId(19 个字节/38 个十六进制数字)。
要启用替代形式并设置从注册表派生的字节,请使用以下命令:
certutil –setreg ca\HighSerial 0x33
将修改指定的字节值以清除符号位并在高半字节中设置一个位,以解决某些非 Microsoft PKI 应用程序中的序列号编码歧义错误。
在 Windows Server 2003 CA 中,会生成三种类型的固定长度序列号。默认形式和备用形式与 Windows 2000 中的相同。Windows 2000 备用形式使用 CryptGenRandom 为每个序列号生成的新随机 8 字节。Windows Server 2003 的新替代形式使用来自 CryptGenRandom 的固定随机 8 字节,在首次尝试颁发证书期间生成,并在注册表中保存为 8 字节的固定 CryptGenRandom 输出 + USHORT CA 证书索引 + DWORD RequestId ( 14 个字节/28 个十六进制数字)。
要在注册表中启用新的备用表单,请使用以下命令:
certutil –setreg ca\HighSerial 0xffffffff
由于来自 CryptGenRandom 的固定随机 8 字节被编码为字符串并保存在注册表中,您可以直接设置它们并将它们用于新的序列号。事实上,任何长度的十六进制字符串都可以在注册表中设置(但必须有偶数位数)。如果序列号溢出总共 19 个字节,则从注册表中使用的字节数将减少。如前所述操作高字节以避免某些非 Microsoft 应用程序出现问题。IETF 标准规定了最多 20 个字节的序列号。