Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Хеш ИД ключа (rfc-sha1) и Хеш ИД ключа (sha1) - в чём разница?
Статус: Участник
Группы: Участники
Зарегистрирован: 25.11.2010(UTC) Сообщений: 11
|
Доброго времени суток. Появилась необходимость научиться вычислять по запросу сертификата его идентификатор ключа субъекта. Если сдампить запрос сертификата (ну или сам сертификат) утилитой certutil, в конце всегда видим строки вида: Хеш ИД ключа (rfc-sha1): какой-то хеш Хеш ИД ключа (sha1): какой-то ДРУГОЙ хеш
Один из них и есть пресловутый "Идентификатор ключа субъекта" в будущем сертификате. Тот что rfc-sha1 вычислить труда не составило - берём открытый ключ и считаем от него SHA1-хеш. Но прикол в том, что в выданном сертификате идентификатором ключа субъекта оказывается второй - Хеш ИД ключа (sha1). Но как же его вычислить? Я перепробовал кучу вариантов, хешируя всё и вся, и окончательно сломал мозг. Знает ли кто-нибудь, как рассчитать идентификатор ключа субъекта из запроса? И чем вообще эти два хеша отличаются?
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 675   Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 95 раз в 68 постах
|
А литературой то какой пользуетесь или только мозг ломаете? :) Рекомендую все же найти стандарт на запросы на сертификат и почитать его. |
С уважением, Юрий Строжевский |
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Тот что rfc-sha1 вычислить труда не составило - берём открытый ключ и считаем от него SHA1-хеш. Каким образом Вы его считаете? |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.11.2010(UTC) Сообщений: 11
|
Цитата:А литературой то какой пользуетесь или только мозг ломаете? :) Ну естественно. RFC наше всё, в моём случае это RFC 5280, описывающий структуру сертификата. В частности, пункт 4.2.1.2. Subject Key Identifier. Там описаны два способа вычисления идентификатора ключа субъекта. Применение первого способа даёт Хеш ИД ключа (rfc-sha1). Второй же способ заранее не годится, потому что предусматривает начальные биты 0100 и общую длину всего 64 бита, в то время как certutil показывает другие начальные биты и полноценный размер в 160 бит. В RFC, описывающих структуру PKCS10 - запроса на сертификат ( RFC 2314, RFC 2986, RFC 5967 ), информация о том, как вычислять идентификатор ключа субъекта, отсутствует. Цитата:Каким образом Вы его считаете? Да как все честные люди. :) Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1. В результате благородный КриптоПро 3.6 вычисляет для меня SHA1-хеш (спасибо ему, ибо мне самому реализовывать хеширование как-то лень :) ). Этот хеш в точности совпадает с Хеш ИД ключа (rfc-sha1), выдаваемым certutil. Но это НЕ идентификатор ключа субъекта! Как же волшебная cerutil считает этот (sha1) хеш? Не дизассемблировать же её в самом деле... разгадка должна быть где-то рядом, но где?.. Отредактировано пользователем 8 февраля 2012 г. 1:08:57(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,087   Сказал «Спасибо»: 612 раз Поблагодарили: 2375 раз в 1868 постах
|
Покажу наглядно и в картинках :) для запроса на сертификат: certutil -dump c:\test\1.p10 >c:\test\1.p10.log Цитата: Запрос сертификата PKCS10 ... Подпись соответствует открытому ключу Хеш ИД ключа (rfc-sha1): 9b 88 5d 45 51 6c 58 39 25 fe 8a d0 f5 94 ef 70 97 31 97 31 Хеш ИД ключа (sha1): 2c ec 05 fa 80 dc c4 98 86 ce 65 88 b0 fb e2 fb d2 b3 b6 eb ИД ключа субъекта (вычисленный): c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd
для выданного сертификата: certutil -dump c:\test\1.cer >c:\test\1.log Цитата: Сертификат X509 .... Не корневой сертификат Хеш ИД ключа (rfc-sha1): 9b 88 5d 45 51 6c 58 39 25 fe 8a d0 f5 94 ef 70 97 31 97 31 Хеш ИД ключа (sha1): 2c ec 05 fa 80 dc c4 98 86 ce 65 88 b0 fb e2 fb d2 b3 b6 eb ИД ключа субъекта (вычисленный): c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd Хеш сертификата(md5): dd cc 2a 01 81 a0 41 f3 6f 60 91 8e 31 24 dc 22 Хеш сертификата(sha1): 3d 97 2a d2 6b 74 98 6d eb b5 84 f7 1c 9b 3b 5d 2a 37 4e cd
Отредактировано пользователем 8 февраля 2012 г. 4:51:01(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,087   Сказал «Спасибо»: 612 раз Поблагодарили: 2375 раз в 1868 постах
|
Далее : Сам Открытый ключ (64 байта) в hex виде: D6F3473FC186523CE95CAEFC07ADBFC666F9332BBA813C04C09BC44365970FFC2917F64FFC906A3326FEF650BBB98B6D38F3E74309F9BC4DA468E7BD341BF603 sha1 от тех 64х байт = 512 бит : F833003A9A532928FD8A4D7913D5610DC8752B25 Т.е. не совпадает "пока" с c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd ЕСЛИ ВЗЯТЬ (0440 + ОК ), 0440D6F3473FC186523CE95CAEFC07ADBFC666F9332BBA813C04C09BC44365970FFC2917F64FFC906A3326FEF650BBB98B6D38F3E74309F9BC4DA468E7BD341BF603 sha1 = 9B885D45516C583925FE8AD0F594EF7097319731 = Хеш ИД ключа (rfc-sha1)но никак не... c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd Программно : szOID_SUBJECT_KEY_IDENTIFIER : 2.5.29.14: Идентификатор ключа субъекта = c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd Отредактировано пользователем 8 февраля 2012 г. 4:51:26(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,087   Сказал «Спасибо»: 612 раз Поблагодарили: 2375 раз в 1868 постах
|
Wissenkrieger написал:Kirill Sobolev написал:Каким образом Вы его считаете? Да как все честные люди. :) Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1. В результате благородный КриптоПро 3.6 вычисляет для меня SHA1-хеш (спасибо ему, ибо мне самому реализовывать хеширование как-то лень :) ). Этот хеш в точности совпадает с Хеш ИД ключа (rfc-sha1), выдаваемым certutil. Но это НЕ идентификатор ключа субъекта! Итого, а может так: Цитата:A key identifier is the unique identifier of a public/private key pair. It can be any unique identifier but is usually the 20-byte SHA1 hash of an encoded CERT_PUBLIC_KEY_INFO structure. и ... BOOL WINAPI CryptHashPublicKeyInfo( __in HCRYPTPROV_LEGACY hCryptProv, __in ALG_ID Algid, __in DWORD dwFlags, __in DWORD dwCertEncodingType, __in PCERT_PUBLIC_KEY_INFO pInfo, __out BYTE *pbComputedHash, __inout DWORD *pcbComputedHash ); осталось проверить ... Отредактировано пользователем 8 февраля 2012 г. 4:33:43(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1. Я думаю, что содержимое которое Вы передаете - это только bit string, т.е. Вы считаете SKID в точности по рекомендации RFC5280. Цитата:CryptHashPublicKeyInfo А вот эта функция берет хеш от всей закодированной структуры. Certutil тоже ей пользуется. |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,087   Сказал «Спасибо»: 612 раз Поблагодарили: 2375 раз в 1868 постах
|
Kirill Sobolev написал:Цитата:Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1. Я думаю, что содержимое которое Вы передаете - это только bit string, т.е. Вы считаете SKID в точности по рекомендации RFC5280. Цитата:CryptHashPublicKeyInfo А вот эта функция берет хеш от всей закодированной структуры. Certutil тоже ей пользуется. Цитата:А вот эта функция берет хеш от всей закодированной структуры. Certutil тоже ей пользуется. Значит - в итоге будет идентификатор субъекта? update: вот нашел http://www.cryptopro.ru/...ro/forum/view.asp?q=2367 Цитата:02.02.2006 12:49:41 Как получить идентификатор ключа субъекта Ответов: 1 Ельнар Всем привет. Помогите Как получить идентификатор ключа субъекта с помощью CryptoAPI Ответы: 02.02.2006 13:55:12 Kirill Sobolev Посмотрите функцию CryptHashPublicKeyInfo
Отредактировано пользователем 8 февраля 2012 г. 14:44:54(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.11.2010(UTC) Сообщений: 11
|
Андрей *Да, вот и я также мозг ломал, пытаясь подсовывать в хеш-функцию то сам ключ, то вместе с соседними служебными байтами в различных комбинациях, и всё было бестолку. Цитата:CryptHashPublicKeyInfo O_O Как же это я умудрился пройти мимо такой вкусной функции... Вот она! Вот она функция моей мечты! Посчитала Хеш ИД ключа (sha1) сразу и без хлопот. Надо впредь внимательнее шерстить MSDN... Большое спасибо за подсказки!
|
|
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Хеш ИД ключа (rfc-sha1) и Хеш ИД ключа (sha1) - в чём разница?
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close