|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
Добрый вечер! Возникла необходимость реализации ЭЦП для части XML файла на Delphi с использованием КриптоПро и Собственно суть, необходимо реализовать подпись в следующем виде : Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Где значения: "Значение хеша в Base64" - Хеш от подписываемого куска XML рассчитанный в соответствии с ГОСТ Р 34.11-94 "Значение подписи в Base64" - Сформированная подпись по стандарту ГОСТ Р 34.10-2001 "Cертификат X.509 в Base64" - Открытый ключ подписи Если я правильно понял после прочтения форма, алгоритм действий следующий: Получаем список доступных контейнеров Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
По клику в lstContainers, имя контейнера записывается в глобальную переменную и все дальнейшие действия производим, с данным контейнером. Получаем значение подписи, кусок кода найден на просторах интернета Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91.
Вопросы: Код: pascal 1. 2. 3. 4. 5. 6. 7.
После выполнения такого вот кода я получается получаю интересующее меня значение открытого ключа и мне его требуется только достать из pbKeyBlob и преобразовать в base64 ? Каким образом будет правильнее реализовать подпись полученного хеша, детально не прорабатывал вопрос, буду раз любым советам. Хотелось бы создать подпись в рамках этой же процедуры. А то будет не юзерфрендли спрашивать пароль на подсчет хеша и подпись отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2014, 18:36 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
Дополню использую JwaWinCrypt.pas для доступа до вызовов API ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2014, 18:38 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
kloppik, Для расчета хеша не нужен пароль, потому что не нужен и контейнер. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2014, 21:29 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
sql2012, спасибо за замечание, присмотрелся внимательнее заметил что действительно не нужен пароль для хеширования. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2014, 11:27 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
kloppik, сори за офтоп, случайно не в Океан'е работаешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2014, 15:16 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
onyx2012, нет, но задачи видимо везде одни и те же, это обмен запросами со СМЭВом ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2014, 18:25 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
Продолжу тут. На текущий момент ситуация такова, у меня получилось реализовать вычисление хеша и его подпись. Код получился приблизительно такой: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118.
Вопрос такого плана, каким образом можно получить X.509 сертификат ключа использовавшегося для шифрования. И общий вопрос звучит так, правильно ли я вообще подписываю, на данный момент я понимаю происходит следующее 1. Получаем контекст провайдера 2. Из провайдера дергаем ключевую пару, в моем случае это AT_KEYEXCHANGE 3. Делаем хеш, он от ключа как я понимаю не зависит, зависит тока от провайдера и поддерживаемых алгоритмов 4. Делаем CryptSignHash для полученного хеша с указанием ключевой пары, подпись будет открытым ключом или закрытым??? 5. Экспортируем сертификат выбранной ключевой пары. Достаточно ли будет данных о сертификате, хеша и подписи, для проверки не изменялись ли исходные данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 16:45 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
Отвечу сам себе, возможно кому то пригодиться и сэкономит некоторое количество часов в жизни. Код получился следующий: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142.
Вопросы из предыдущего комментария в принципе актуальны, если кто то может ответить или поделиться ссылками, буду только рад. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 17:22 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
kloppik Вопрос такого плана, каким образом можно получить X.509 сертификат ключа использовавшегося для шифрования. Может для создания электронной подписи? Можно так: Подключиться к Хранилищу сертификатов (MY | ROOT) и сверить открытый ключ полученный через CSP и в сертификате. Если для шифрования (дословно трактую вопрос): до расшифровки - необходимо получить информацию о получателях (серийный номер сертификата и информацию по УЦ, в котором выдан сертификат). Далее (до начала расшифровки) - подключаемся к хранилищу (MY | ROOT), находим сертификат, по нему запрашиваем информацию о CSP\контейнере и получив указатель на закрытый ключ - идем к функции расшифровки... kloppik И общий вопрос звучит так, правильно ли я вообще подписываю, на данный момент я понимаю происходит следующее 1. Получаем контекст провайдера 2. Из провайдера дергаем ключевую пару, в моем случае это AT_KEYEXCHANGE Бывают и исключения: AT_SIGNATURE kloppik3. Делаем хеш, он от ключа как я понимаю не зависит, зависит тока от провайдера и поддерживаемых алгоритмов Хеш зависит от алгоритма, если бы он зависел от CSP ... (хотя встречались ранние альфа\бета версии, в которых хеши не так считались) kloppik4. Делаем CryptSignHash для полученного хеша с указанием ключевой пары, подпись будет открытым ключом или закрытым??? Подписание будет с участием закрытого ключа и случайного числа. И такая специфика ГОСТ-а дает каждый раз разные значения ЭП для одних и тех же подписываемых байтов. kloppik5. Экспортируем сертификат выбранной ключевой пары. У если "у меня" его нет? :) kloppikДостаточно ли будет данных о сертификате, хеша и подписи, для проверки не изменялись ли исходные данные? Вполне. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 23:23 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
sql2012 Может для создания электронной подписи? Можно так: Подключиться к Хранилищу сертификатов (MY | ROOT) и сверить открытый ключ полученный через CSP и в сертификате. Да для подписи, неверно сформулировал. А тут проблема в том, что ключи и сертификат лежат на токене, и у меня не получилось выдернуть сертификат с хранилища, подозреваю что его изначально надо туда положить. sql2012kloppik И общий вопрос звучит так, правильно ли я вообще подписываю, на данный момент я понимаю происходит следующее 1. Получаем контекст провайдера 2. Из провайдера дергаем ключевую пару, в моем случае это AT_KEYEXCHANGE Бывают и исключения: AT_SIGNATURE По идее, как раз таки использование AT_KEYEXCHANGE это исключение, для подписи по феншую надо использовать AT_SIGNATURE , но в моем случае на токенах не оказалось этой ключевой пары, я пробовал ее генерировать, но у с генерированной ключевой пары отсутствует сертификат. А сертификат мне обязателен, он содержит инфу кто сформировал подписанный запрос. У меня подпись используется не только для страховки от подмены данных в запросе, но и для получения данных о том какой конкретно сотрудник сформировал запрос. sql2012kloppik 5. Экспортируем сертификат выбранной ключевой пары. У если "у меня" его нет? :) Ну судя по ответам, ты знаешь что делать в этом случае)), по идее открытого ключа будет достаточно для проверки валидности подписи, если я все правильно понял, в моем случае сертификат обязательно будет, либо эта ключевая пара не подходит для подписи. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2014, 12:28 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
kloppik Ну судя по ответам, ты знаешь что делать в этом случае)), по идее открытого ключа будет достаточно для проверки валидности подписи, если я все правильно понял, в моем случае сертификат обязательно будет, либо эта ключевая пара не подходит для подписи. "Подписывают" не сертификатом... Пример: У меня есть контейнеры с AT_KEYEXCHANGE и с AT_SIGNATURE, но нет сертификатов. Будет ли этого достаточно для создания подписи? - да. Будет ли работать экспорт несуществующего сертификата? - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2014, 23:37 |
|
Delphi + КриптоПро + ЭЦП
|
|||
---|---|---|---|
#18+
sql2012"Подписывают" не сертификатом... Да с этим я согласен, для подписи достаточно закрытого ключа, для валидации подписи открытого, добавление сертификата в моем случае служит не только цели проверки корректности подписи, но и для цели выяснения кто эту подпись создал. Мой вопрос был не обобщением процедуры, а уточнением правильности моего понимания что непроходимо реализовать в моем конкретном случае. Если не прикладывать сертификат, то невозможно к примеру принимать запросы от конкретной организации, а в моем случае это критично. Т.е. со стороны принимающей запрос, происходит не только проверка корректности подписи и данных, но и проверка на то что запрос подписан конкретным пользователем с конкретными правами. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2014, 12:23 |
|
|
start [/forum/topic.php?fid=58&fpage=1&tid=2047545]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 249ms |
total: | 397ms |
0 / 0 |