Сертификат соответствует закрытому ключу

В настоящее время мы реализуем апплет цифровой подписи в java. Пользователи будут иметь токены, содержащие хранилища закрытых ключей и соответствующие им сертификаты. Сертификаты и закрытые ключи будут иметь разные псевдонимы.

Что мне нужно сделать, так это вызвать/сопоставить закрытый ключ в хранилище с сертификатом, выбранным пользователем во время подписания. Как я могу сопоставить закрытый ключ с соответствующим сертификатом в java? Мне нужно что-то вроде getkey(псевдоним, пароль), где псевдоним получается из совпадения между выбранным сертификатом и ключом.


person Boris Ostrovsky    schedule 17.12.2012    source источник
comment
Приватный - это именно то, что он есть - ключ... Невозможно сопоставить его с сертификатом (открытым ключом). Конечно, вы знаете закрытый ключ для данного сертификата во время выбора, так как они хранятся вместе в вашем хранилище ключей. Просто держите их обоих вместе (кортеж).   -  person home    schedule 18.12.2012
comment
Теолодис, в настоящее время пытается сопоставить хеш через мод обоих (после получения открытого ключа от ceet)   -  person Boris Ostrovsky    schedule 18.12.2012
comment
Хоум, это не совсем точно. Публичные и закрытые ключи могут быть сопоставлены, вот и весь смысл   -  person Boris Ostrovsky    schedule 18.12.2012
comment
Я не уверен, что ваша реализация является хорошим способом - см. javadoc: KeyStore.PrivateKeyEntry Этот тип записи содержит криптографический PrivateKey, который может храниться в защищенном формате для предотвращения несанкционированного доступа. Он также сопровождается цепочкой сертификатов для соответствующего открытого ключа. Закрытые ключи и цепочки сертификатов используются данным объектом для самоаутентификации. Приложения для этой аутентификации включают организации по распространению программного обеспечения, которые подписывают файлы JAR как часть выпуска и/или лицензирования программного обеспечения.   -  person RonK    schedule 18.12.2012


Ответы (2)


Если вы используете ECC, то

Q = k * P

Где Q — ваш открытый ключ, поэтому, когда вы знаете закрытый ключ k, вы также знаете базовую точку P и кривую, чтобы вы могли " легко" вычислить открытый ключ.

Проблема с RSA также проста при использовании известных реализаций, где показатель степени e фиксирован. Если это не исправлено, это может быть сложно, но не так уж сложно.

Совершенно другая проблема... как бы вы сопоставили данный публичный ключ с сохраненным сертификатом? И другой вопрос, зачем делать что-то подобное? Вы должны хранить информацию о сертификате после подписания и доступа к соответствующему сертификату в хранилище ключей Java. Неоднозначность — это всегда проблема, особенно в криптографии вы должны быть настолько явными, насколько это возможно.

person damiankolasa    schedule 17.12.2012
comment
Итак, еще немного ясности. Мы используем pkcs#11. Запросы сертификатов генерируются автоматически, а закрытые ключи хранятся в токенах с псевдонимами 00000001.key и т. д. в зависимости от номера запроса. Затем сертификаты отправляются обратно центром сертификации, а также сохраняются в токене. Эти сертификаты имеют псевдонимы для простоты использования клиентами. При подписании клиент выбирает соответствующий сертификат. Однако для операции подписи требуется как сертификат, так и соответствующий закрытый ключ. Таким образом, необходимо найти его. - person Boris Ostrovsky; 18.12.2012
comment
И вы не можете изменить псевдоним закрытого ключа (возможно, на ‹public_key_alias›_priv) после того, как CSR вернется из вашего центра сертификации? Или сохранить закрытый ключ с сертификатом после получения ответа с правильными псевдонимами? В противном случае это будет проблематично... Потому что перебирать закрытые ключи - ПЛОХАЯ идея. У вас должно быть какое-то явное соединение, возможно, вы можете добавить в свой сертификат некоторый атрибут, который будет указывать на псевдоним закрытого ключа, но кто-то может посчитать это раскрытием информации;) - person damiankolasa; 18.12.2012
comment
@BorisOstrovsky обычно сертификату и закрытому ключу присваивается один и тот же идентификатор в PKCS # 11. Вы должны сгенерировать пару ключей и сертификат в одном и том же токене PKCS # 11, поэтому, когда вы откуда-то отправите сертификат, найдите его в своем токене, а затем найдите соответствующий закрытый ключ. - person Maarten Bodewes; 18.12.2012

Если я понял ваш дизайн - ваша идея - это не то, с чем вам следует продолжать, однако java должна поддерживать то, что вам нужно:

Используйте этот код:

 KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
 ks.getEntry("privateKeyAlias", password);
 Certificate certificateFromPrivateKey = pkEntry.getCertificate();
 KeyStore.TrustedCertificateEntry certEntry = (KeyStore.TrustedCertificateEntry)ks.getEntry("certificateAlias, password);
 Certificate certificateFromPublicKey = certEntry.getCertificate();

 if (certificateFromPrivateKey.equals(certificateFromPublicKey)) ...

Подробнее об этом читайте в javadoc, но Я действительно думаю, что вы идете об этом неправильно.

Также - соответствующий API (я предполагаю, что вы его используете) - http://docs.oracle.com/javase/6/docs/api/java/security/Signature.html

person RonK    schedule 17.12.2012
comment
Думаю, немного назад. Нам нужно найти закрытый ключ (можно найти много в магазине) на основе сертификата, выбранного пользователем. - person Boris Ostrovsky; 18.12.2012