TIdX509 计算证书指纹 16 个字节而不是 20 个字节
TIdX509 calculates cert fingerprint 16 bytes instead of 20
我在 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
我还找到了这个网站:Calculate Fingerprint 它也生成了 20 组指纹,每组 2 个,而不是 16 个。
所以,我的问题是:为什么 Indy 组件 TIdX509 生成的指纹只有 16 组,每组 2 个,而应该是 20 个?
SHA-1 的结果应该是 160 位或 20 字节,这就是您从 Java 程序中得到的结果,不足为奇。
Quick google 发现您正在使用的 Delphi 组件正在计算消息摘要:http://www.e-iter.net/Knowledge/Indy9/007901.html#0000, that most likely means MD5 摘要,这是预期的 128 位或 16 字节。
基本上将 MessageDigest.getInstance("SHA-1")
更改为 MessageDigest.getInstance("MD5")
应该可以满足您的要求。
我在 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
我还找到了这个网站:Calculate Fingerprint 它也生成了 20 组指纹,每组 2 个,而不是 16 个。
所以,我的问题是:为什么 Indy 组件 TIdX509 生成的指纹只有 16 组,每组 2 个,而应该是 20 个?
SHA-1 的结果应该是 160 位或 20 字节,这就是您从 Java 程序中得到的结果,不足为奇。
Quick google 发现您正在使用的 Delphi 组件正在计算消息摘要:http://www.e-iter.net/Knowledge/Indy9/007901.html#0000, that most likely means MD5 摘要,这是预期的 128 位或 16 字节。
基本上将 MessageDigest.getInstance("SHA-1")
更改为 MessageDigest.getInstance("MD5")
应该可以满足您的要求。