13.07.2004 17:41:58Хочу простого Ответов: 7
Игорь
Есть Сервер и Клиент.
Клиент у себя генерит ключевую пару для ЭЦП (желательно без использования контейнеров), выгружает оба ключа в файлы, передает открытый ключ Серверу, и шлет ему подписанные на секретном ключе данные. Сервер проверяет подпись на полученном открытом ключе.
Желательно НЕ хранить ключи в контейнерах на обеих сторонах.
Как можно проще всего это реализовать?
 
Ответы:
14.07.2004 11:06:11Василий
Ключевая пара подписи может храниться либо в контейнере (в реестре или на съемном носителе), либо в файле.
С точки зрения пользователя, как мне кажется, большой разницы нет - для создания ЭЦП нужно предоставить носитель ключевой информации.
При использовании нашего криптопровайдера возможности экспорта ключей в файл нет (по требованиям безопасности). Поэтому ключевая пара ЭЦП может храниться только в контейнере.
14.07.2004 15:45:16Игорь
"Ключевая пара подписи может храниться либо в контейнере, либо в файле."

и

"При использовании нашего криптопровайдера возможности экспорта ключей в файл нет (по требованиям безопасности)."

1. Чему верить?
2. По каким требованиям безопасности? Иметь ЗАКРЫТЫЙ ключ в файле это нормально и общепринято.
3. Что тогда выгружает CryptExportKey( ... PRIVATEKEYBLOB ... ) ?
14.07.2004 16:03:47Василий
1. CSP бывают разные. Например, для MS CSP - ключевая пара может быть в контейнере или в файле сертификата.
2. Нормально-то нормально, но общепринято ли - большой вопрос.
3. Блоб закрытого ключа (который получается в результате CryptExportKey) - совсем другой объект, работать с ним можно только на более низком уровне, при этом всё равно потребуется импортировать этот блоб в контейнер.
14.07.2004 17:06:27Игорь
"общепринято ли - большой вопрос."
А где ж ещё? В контейнерах? Дык это только в CSP они есть. А так везде в файлах.

Могу ли я создать контейнер, выгрузить секретный/открытый блобы, не глядя в их нутрь сохранить в файл, удалить ключи из контейнера и потом по надобности импортировать обратно?
14.07.2004 17:31:09Василий
Почему такая нелюбовь к контейнерам? :-)
Ключевой контейнер нашего CSP, записанный на дискете (или другом съемном носителе), передставляет собой несколько файлов специального формата, в которых содержится, кроме собственно ключей, информация об алгоритмах и их параметрах, средства контроля целостности и восстановления при сбоях, а также может быть записан сертификат открытого ключа.
Конечно, можно каждый раз создавать в памяти новый контейнер, импортировать в него из блоба закрытые ключи, но, ведь по сути дела ту же процедуру делает CSP при считывании ключа из контейнера. То есть Вы просто усложните себе жизнь - вместо пары вызовов для считывания ключа - CryptAcquireContext, CryptGetUserKey будет нужно больше:
CryptAcquireContext,
CryptSetProvParam,
CryptImportKey,
CryptSetKeyParam,
кроме того, придётся разбираться с идентификаторами алгоритмов и других параметров, кроме того, нет явной связи с сертификатом открытого ключа (если его использовать для проверки ЭЦП, если не использовать - тогда совсем не ясна связь между ключом и его владельцем, то есть Вам придется делать свой вариант PKI для распределения ключей клиентам и проверки их на сервере)
14.07.2004 18:15:11Игорь
Да потому что не нужны мне эти контейнеры!
Приведенную в моем первом посте схему я реализовал элементарно, без контейнеров, но на симметричных ключах. И все работает просто и понятно. На Сервере все ключи клиентов хранятся в моей базе в удобном мне формате. А тут я не понимаю как хранить в контейнере 500 ключей, и обращатся к нужным ключам. Или делать для каждого ключа контейнер? И как, например, делать бэкап контейнеров? Я делаю бэкап базы. Мне надо то только заменить симметричный ключ на пару, отдать клиенту файлик с закрытым ключем и прописать в СВОЕЙ, удобной МНЕ базе на Сервере открытый ключ.
Может просто напишите 5 строк кода как же все-таки создать пару ключей и выгрузить эти блобы? Как я не пробовал, выдает ошибку NTE_BAD_KEY_STATE

Спасибо.
14.07.2004 18:31:12Василий
Контейнеры будут только у клиентов - по штуке на лицо. Вообще, считается, что свои закрытые ключи клиент хранит (и бэкапирует) сам и никому их не передаёт.
Весь смысл ЭЦП в установлении авторства подписывателя. А для этого он должен быть уверен, что владеет ключом один.

На сервере нужны только открытые ключи клиентов - в виде сертификатов или в виде блобов PUBLICKEYBLOB.

Примеры есть в http://www.cryptopro.ru/CryptoPro/test/sample2_0.zip