Самоподписанный сертификат против CA - PullRequest
1 голос
/ 17 апреля 2020

Я делаю решение для шифрования файлов через комбинацию RSA и AES. RSA в основном используется для подтверждения связи здесь для шифрования ключа симметрии c и дешифрования на стороне получателя с помощью пар ключей.

Я использовал Java хранилища ключей для закрытых ключей и самоподписанные сертификаты для Publi c Ключи. Оба создаются следующим образом:

KEY STORE

keytool -genkey -keyalg RSA -alias BANK -keystore receiverKeystore.jks -validity 360 -keysize 2048

CERTIFICATE EXPORT

keytool -export -alias BANK -keystore receiverKeystore.jks -rfc -file bankCert.cer

Аналогично используются оба в Java как показано ниже:

Закрытый ключ

private void setKeys() {

        KeyStore senderKeyStore = null;
        String keyStorePassword = "fms123";

        try {

            senderKeyStore = KeyStore.getInstance( "JKS" );  
            FileInputStream is = new FileInputStream( keystorePath );
            senderKeyStore.load( is, keyStorePassword.toCharArray() );  

            senderPrivateKey = ( PrivateKey ) senderKeyStore.getKey( KEYSTORE_ALIAS, keyStorePassword.toCharArray() );

            receiverPublicKey = loadReceiverPublicKeyFromCertificate();
        }
        catch ( Exception e ) {
            System.out.println( " Exception in setting keys from key store = " + e );
        }

    } 

PUBLI C KEY

private PublicKey loadReceiverPublicKeyFromCertificate () {

        PublicKey publicKey = null; 

        try {

            FileInputStream fin = new FileInputStream( certificateFilePath );
            CertificateFactory factory = CertificateFactory.getInstance( "X.509" );
            X509Certificate certificate = ( X509Certificate ) factory.generateCertificate( fin );
            publicKey = certificate.getPublicKey();
        }
        catch ( Exception e ) {
            System.out.println( " Exception in loading receiver certificate = " + e );
        }

        return publicKey;
    }

Теперь у меня есть следующие вопросы:

  1. Правильный ли способ сделать это?
  2. Если я использую доверенный сертификат здесь, каким будет ключ publi c взято из этого? Будет ли он получен таким же образом? а для закрытых ключей? я буду использовать тот же подход или что-то из сертификата?

  3. Как я могу распространить свой сертификат получателю? Что за безопасное общение для этого?

Я новичок в шифровании, буду очень рад получить некоторые советы.

1 Ответ

2 голосов
/ 17 апреля 2020

Ваше рукопожатие называется установление ключа . Рукопожатие используется для (онлайн) видов транспорта, и я не думаю, что вы разрабатываете это. Вместо этого я бы использовал хранилище ключей PKCS # 12, JKS вроде бы не рекомендуется. Основная идея использования char[] для пароля заключается в том, что вы можете удалить его содержимое непосредственно после его использования, поэтому использование String в качестве ввода не является хорошей идеей. Строки обычно интернированы и всегда неизменны в Java, поэтому вы не можете уничтожить их без уродливых хаков с использованием собственного кода.

Доверенные сертификаты ничем не отличаются от ненадежных сертификатов , Да, вы можете извлечь из него ключ publi c. Закрытые ключи обычно хранятся вместе с цепочкой сертификатов, ведущей к конечному пользовательскому сертификату, которому принадлежит закрытый ключ. Однако закрытый ключ не является частью сертификата, и поэтому вы не можете получить закрытый ключ из него. Это нормально, хотя закрытые ключи должны быть установлены в том месте, где они необходимы; нет необходимости транспортировать их, кроме как для целей резервного копирования.

Как вы можете отправить сертификат получателю, зависит от вас. Самое сложное - заставить получателя доверять сертификату. Допустимо использовать заранее установленный ключ, такой как доверенный ключ PGP. Если у вас нет такого ключа, значит, у вас проблемы. Что вы можете сделать, так это использовать другие методы для установления доверия sh. Пусть собеседник позвонит вам, а затем удостоверится в правильности отпечатка пальца сертификата (в основном это просто га sh над сертификатом), возможно, один из самых простых способов. Если вы хотите, чтобы ваши пользователи были не слишком далеко, конечно, это возможно и лично. Если вы не можете доверять тому, кто находится на другой стороне, то установить полное доверие, очевидно, невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...