添加随机序列号如何提高证书的安全性?

信息安全 加密 证书 公钥基础设施 威胁缓解
2021-08-29 08:35:28

这篇文章说:

“查找冲突是一个棘手的过程,因为它需要您处理嵌入证书中的公钥位(有关更多详细信息,请参阅本文)。此外,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 个字节的序列号。

1个回答

简短的回答。好处是来自不可预测的序列号,而不是来自任何旧的序列号。

事实上,顺序序列号不会增加安全性,因为它很容易预测。但是随机化序列号(因此很难预测)确实使得利用已知的 MD5 碰撞攻击来获得伪造证书变得更加困难。让我解释。

背景。当 CA 颁发证书时,它在 MD5(P) 上包含签名,用于某些证书有效负载 P,其中包括公钥、域名和序列号。已知的对 MD5 的碰撞攻击允许攻击者选择具有相同 MD5 散列的两个值 P 和 Q。这可以用来攻击使用 MD5 的 CA,如下所示。攻击者使用 MD5 碰撞攻击找到具有以下属性的 P,Q:P 是 CA 愿意签署的良性证书有效负载(例如,攻击者控制的某个新域的证书),但 Q 是恶意证书CA 永远不会签署的有效负载(例如,microsoft.com 的证书)。攻击者向CA发送P对应的cert请求;CA 对其进行签名并返回签名的证书;然后这个证书上的签名也将是 Q 上的有效签名。

请注意,此攻击要求攻击者预测 CA 为 P 签署证书时将使用的序列号的值。如果序列号是按顺序分配的,则此预测任务很容易。但是如果序列号是(比如说)一个加密随机的 128 位数字,那么攻击就不再适用了。因此,有些人建议使用随机序列号作为缓解措施。

更多详情。 有关详细信息,请参阅以下研究论文:

推荐。最好的防御是:不要使用MD5!停止使用它。CA 应该使用现代散列,如 SHA1 或 SHA256 或 SHA2。他们在颁发证书时不应该使用 MD5。

但是,如果由于某种原因您被迫使用 MD5,那么随机化您的序列号是一种合理的缓解措施。实际上,使用随机序列号可能不是一个坏主意,无论您使用哪种哈希算法,作为一种纵深防御的形式。