У меня есть небольшая программа на Java и Delphi 5, обе они были разработаны для обработки сертификатов.
В delphi я использую компонент indy 9: TIdX509, в этом объекте есть метод для получения Fingerprint в виде String, я нигде не нашел, как рассчитывает TIdX509. Я мог бы просто обнаружить, что он не должен иметь 16 байтов, например:
72: 7F: 8D: DF: 8D: 5F: 61: A3: 9E: DF: 38: CA: C5: 5B: 18: 0A 16 групп по 2 *. 1005 *
Итак, я протестировал на Java, чтобы увидеть, какой отпечаток будет рассчитан, и выполнил свою функцию на основе этого ответа Как рассчитать отпечаток SHA-1 сертификата X.509?
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.
Итак, мой вопрос: почему инди-компонент TIdX509 генерирует отпечаток всего с 16 группами по 2, когда его должно быть 20?