手动验证SSL数字签名时出现的问题

时间:2018-08-14 07:30:55

标签: java ssl ssl-certificate wireshark signature

我目前正尝试仅使用Wireshark和Java IDE(Eclipse)来验证ssl证书的数字签名。为了做到这一点,根据我读过的here,我需要:

  1. 使用正确的算法(由证书本身指定)计算ASN.1 DER编码的 tbsCertificate 的哈希。 (通常为SHA-256)

  2. 再次使用指定算法(通常是RSA),使用证书颁发者的公钥对签名进行解码

  3. 比较两个结果,应该相同。

现在,我既可以计算哈希值,也可以解密签名,但是我遇到了一个问题:签名的RSA解码并不能完全导致哈希值,而是一个更长的字符串,看起来像这个:

3031300d0609608648016503040201050004206b6cba600a70b90a806e9bf42d71d2253f762b8090fb021a6863e60feb3dd421(十六进制)

在谷歌搜索时,我发现this answer解释了为什么签名的RSA解码与哈希不匹配。显然,由于安全问题,该字符串包含哈希。 经过进一步的小型研究,在3个解码签名的样本中,字符串

3031300d060960864801650304020105000420

(我认为是填充)在所有已解码签名中都是常量,而其余(我认为是哈希)始终是SHA-256哈希长度相同的不同字符串。 / p>

不用说,计算得出的哈希值与从解码签名中提取的哈希值不匹配。我怎么了?

谢谢。

注意:

  1. 我使用Wireshark协议解剖器提取所需的数据(请参见here)。我将数据包的一部分复制为十六进制通量,然后使用以下函数将其转换为字节数组。

    public static byte[] hexToBytes(String hexString)
    {
        int len = hexString.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) 
        {
            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) 
            << 4) + Character.digit(hexString.charAt(i+1), 16));
        }
        return data;
    }
    
  2. 我假设数据包的数据已经是ASN.1 DER格式。 (我错了吗?)

0 个答案:

没有答案