#java #rsa #keystore
#java #rsa #хранилище ключей
Вопрос:
В настоящее время я работаю над извлечением пары ключей из my .jks, используя встроенные библиотеки Java и Javax, а не KeyTool или какой-либо API, такой как BouncyCastle. Проблема, с которой я сталкиваюсь, связана с равенством моих двух экземпляров пары ключей.
На скриншоте отладчика выше (где это подчеркнуто) вы можете заметить, что адрес памяти экземпляров пары ключей. На скриншоте показано, что адреса памяти не идентичны для пользовательских ключей / PrivateKey по сравнению с keyPairFromKeyStore / PrivateKey и, следовательно, пользовательских ключей по сравнению с keyPairFromKeyStore. Однако на приведенном ниже скриншоте консоли выходные данные отражают два разных сравнения равенства:
userKeys.&etPrivate().equals(keyPairFromKeyStore.&etPrivate()); // true
userKeys.&etPublic().equals(keyPairFromKeyStore.&etPublic()); // true
и он вернул значение true для обоих сравнений, убедив меня в том, что содержимое пары ключей идентично как для сравнений открытого, так и закрытого ключей. (Скриншот консоли ниже)
В последней строке скриншота консоли я оценил другое сравнение равенства, сравнивая:
keyPairFromKeyStore.equals(userKeys) // false
на что выводится значение false.
Для контекста, когда я добавлял свою пару ключей в файл .jks с помощью seyKeyEntry, я использовал цепочку сертификатов X509Certificate, содержащую два экземпляра X509Certificate, подписанных «SHA256withRSA» (один для моей пары ключей на стороне клиента (dn = «CN= ROOT», в 0-м индексе цепочки сертификатов), и пользовательскую пару ключей (пара, сохраненная в .jks, «dn = «CN= TOP» amp; в 1-й индекс цепочки сертификатов).
Мой вопрос в том, каковы возможные аргументы для последнего оператора равенства, возвращающего false? Если требуется какая-либо более важная информация, не стесняйтесь спрашивать. Заранее приношу извинения, поскольку я не могу опубликовать фактический код, который я написал по академическим причинам.
Комментарии:
1. Смотрите Javadoc.
KeyPair
не переопределяетObject.equals()
.2. Да! Я просто изучал это, и я рад, что получил подтверждение от кого-то другого. Вероятно, также потребуется переопределить метод hashCode(…)
3. Вам не нужны никакие гарантии от кого-либо еще. Именно то, что написано в Javadoc. Я не знаю, как вы планируете переопределять какие-либо методы в
final
классе.4. Я бы не использовал
equals()
ни на одном криптообъекте, потому что equals зависит от реализации, но Java может иметь доступ к нескольким поставщикам криптографии, использующим разные реализации. Поэтому я бы настоятельно рекомендовал сравнивать вывод только&etEncoded()
открытых / закрытых ключей. &etEncoded возвращает криптообъект стандартизированным способом.