TIdX509 вычисляет отпечаток сертификата 16 байтов вместо 20 - PullRequest
0 голосов
/ 14 мая 2018

У меня есть небольшая программа на 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?

1 Ответ

0 голосов
/ 14 мая 2018

Результат 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") должно делать то, что вы хотите.

...