TIdX509 вычисляет отпечаток сертификата 16 байтов вместо 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, чтобы увидеть, какой отпечаток будет рассчитан, я выполнил свою функцию на основе этого ответа Как рассчитать отпечаток 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?


person Gustavo    schedule 14.05.2018    source источник


Ответы (1)


Результат SHA-1 должен быть 160-битным или 20-байтовым. это то, что вы получаете от своей Java-программы, никаких сюрпризов.

Быстрый поиск в Google обнаруживает, что компонент Delphi, который вы используете, вычисляет дайджест сообщения: http://www.e-iter.net/Knowledge/Indy9/007901.html#0000, что, скорее всего, означает MD5, который, как и ожидалось, составляет 128 бит или 16 байт.

В основном изменение MessageDigest.getInstance("SHA-1") на MessageDigest.getInstance("MD5") должно делать то, что вы хотите.

person hgrey    schedule 14.05.2018
comment
Правильно, просто изменил параметр SHA-1 на MD5 в Java и смог сгенерировать 16 байтов, позор мне, что я не нашел эту страницу в Google, спасибо за ответ - person Gustavo; 14.05.2018