如果他们发现一个不同的值产生与网站的实际公钥相同的 SHA-1 摘要,他们得到了什么?
假设我们正在处理 MD5。SHA-1 攻击仍在进行中,我希望它们遵循与 MD5 上可能的攻击大致相同的路线。
使用 MD5 可以创建两个不同的值来产生哈希冲突(在某些边界内)。然而,这并不意味着只要给定任何输入数据和该数据的哈希值就可以创建哈希冲突。
在您的示例中,这意味着您不能只获得一个 MD5 或 SHA1 签名证书,然后创建一个假的。因此,在 CA 中创建的内部 CA 证书风险不大。但是,可以将特殊格式的证书发送到 CA,然后以签名仍然可以验证的方式更改签名数据。
因此,请求证书的同一组织就是发起攻击的组织。这意味着他们已经获得了私钥。所以替换公钥是可能的,但没有太大意义。
那么他们能做什么。好吧,这是关于证书中的“其他一些信息”。这可以由请求信息的组织进行更改。基本上他们可以在那里放任何他们想要的东西。这意味着某个域的证书可能成为另一个域的证书。该证书可以成为可用于创建其他证书的证书(尽管路径长度限制可能会缓解该问题)。
换句话说,证书颁发机构签署了一个散列,这可能对其他数据有效。证书颁发机构不再知道它正在签署什么证书!作为用户,您可以获得 mail.google.com 的证书,该证书具有为happy.attacker.com 创建的有效签名,攻击者持有私钥。换句话说,您可能根本没有与 Google 交流!
误解:
散列函数应用于主题的公钥。
不,它应用于需要显式信任的证书属性(示例中的域名也是如此);不仅仅是公钥。
CA 然后使用他们的私钥来加密哈希输出。
不,签名生成不是加密。对于 RSA,它还使用模幂运算,但这并不等同于加密。甚至 RSA 规范 - PKCS#1 - 也区分签名生成和加密。
该加密的输出以及一些其他信息成为证书。
有些信息非常重要,其中很多信息都与公钥一起签名。有效期、颁发者、公钥、签名、主题、密钥使用、路径长度限制、撤销相关信息都非常重要。
因此,假设某人决心冒充具有 SHA-1 证书的站点并通过尝试产生哈希冲突来攻击 SHA-1 摘要。
这仍然需要大约 2^159 次操作。所以不,严肃的研究人员不太可能尝试过。
他们现在可以伪造一个看似由 CA 签名的证书,而不是包含 X 的实际公钥,但是如果没有匹配的 X 私钥,这对他们来说不是无用的吗?
嗯,是。实际上,公钥不包含单个值 X,它由模数和指数组成,它们是在 X5.09 证书中编码的 ASN.1/DER。所以 X 必须有一个非常具体的结构。如果您尝试以这种方式破坏证书(如上文所述,这是不可行的)。因此,只有用特定的 X 替换密钥才有用。
然而,签名的密钥和证书的编码可能包含附加信息。这可以被攻击者滥用,并且实际上需要执行实际的 MD5 攻击。
我认为在数字签名中使用哈希主要是出于性能原因,因为像 RSA 这样的公钥加密对于大量输入来说很慢。
不,不仅仅是性能原因。RSA 需要填充,这会比消息的密钥(模数)大小少大约 11 个字节 - 以防仍然使用较旧的 PKCS#1 v1.5 填充。一般来说,签名的属性会比这更大。在这种情况下,您需要使用哈希方法压缩数据。ECDSA,另一种公钥算法,实际上不能加密任何数据。
通常,最好将散列方法视为签名算法的配置选项。换句话说,它是签名算法的一个组成部分。这也是各种标准中规定的方式。