-1

我在 java 和 delphi 5 中有一个小程序,它们都是为处理证书而设计的。

在delphi中,我使用了一个indy 9组件:TIdX509,在这个对象中有一种方法可以将指纹作为字符串,我没有找到TIdX509如何计算的任何地方。我只能发现它不应该有 16 个字节,例如:

72:7F:8D:DF:8D:5F:61:A3:9E:DF:38:CA:C5:5B:18:0A 16 组 2 个。

所以我在 Java 中进行了测试,看看会计算什么指纹,我根据这个答案做了我的功能如何计算 X.509 证书的 SHA-1 指纹?

    public static String generateFingerPrint(X509Certificate cert)
        throws CertificateEncodingException, NoSuchAlgorithmException {

    MessageDigest digest = MessageDigest.getInstance("SHA-1");
    byte[] hash = digest.digest(cert.getEncoded());

    final char delimiter = ':';
    // Calculate the number of characters in our fingerprint
    // ('# of bytes' * 2) chars + ('# of bytes' - 1) chars for delimiters
    final int len = hash.length * 2 + hash.length - 1;
    // Typically SHA-1 algorithm produces 20 bytes, i.e. len should be 59
    StringBuilder fingerprint = new StringBuilder(len);

    for (int i = 0; i < hash.length; i++) {
        // Step 1: unsigned byte
        hash[i] &= 0xff;

        // Steps 2 & 3: byte to hex in two chars
        // Lower cased 'x' at '%02x' enforces lower cased char for hex
        // value!
        fingerprint.append(String.format("%02x", hash[i]));

        // Step 4: put delimiter
        if (i < hash.length - 1) {
            fingerprint.append(delimiter);
        }
    }

    return fingerprint.toString();

}

我从中得到的结果类似于: 56:ee:54:2b:cb:d3:8a:e2:1d:13:e1:f3:9c:f6:8f:3b:69:18:95:0a - 20组2人

我还找到了这个网站:计算指纹,它还生成了 20 组 2 组而不是 16 组的指纹。

所以,我的问题是:为什么 indy 组件 TIdX509 生成的指纹只有 16 组 2,而应该是 20?

4

1 回答 1

2

SHA-1的结果应该是 160 位或 20 字节,这就是您从 Java 程序中得到的结果,这不足为奇。

快速谷歌发现您正在使用的 Delphi 组件正在计算消息摘要:http://www.e-iter.net/Knowledge/Indy9/007901.html#0000,这很可能意味着MD5摘要,即 128 位或 16字节按预期。

基本上MessageDigest.getInstance("SHA-1")改为MessageDigest.getInstance("MD5")应该做你想做的事。

于 2018-05-14T15:29:47.133 回答