首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自-Signed证书与CA

自-Signed证书与CA
EN

Stack Overflow用户
提问于 2020-04-17 07:37:42
回答 1查看 167关注 0票数 1

我正在通过RSA和AES的结合为文件加密做一个解决方案。RSA主要用于握手,加密对称密钥,并通过密钥对在接收端解密。

我为私钥使用了Java密钥存储库,为公钥使用了自签名证书.这两种方法的创建如下:

密钥存储

代码语言:javascript
运行
复制
keytool -genkey -keyalg RSA -alias BANK -keystore receiverKeystore.jks -validity 360 -keysize 2048

证书导出

代码语言:javascript
运行
复制
keytool -export -alias BANK -keystore receiverKeystore.jks -rfc -file bankCert.cer

同样,这两种方法在Java中都使用,如下所示:

私钥

代码语言:javascript
运行
复制
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 );
        }

    } 

公钥

代码语言:javascript
运行
复制
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. ,如果我在这里使用可信的证书,将如何从它获取公钥?会以同样的方式取走吗?私钥呢?我是否会使用certificate?
  3. How的相同方法或其他方法,我可以将我的证书分发给接收方吗?那应该是什么安全的通信?

我对加密是新手,会很高兴得到一些建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-17 12:15:16

你的握手被称为密钥建立。握手是用于(在线)交通方式的,我不认为你在发展这种方式。我会使用PKCS#12密钥存储,而不是JKS。使用char[]作为密码的整个想法是,您可以在使用它之后直接删除它的内容,所以使用String作为输入不是一个好主意。字符串通常是内部的,并且在Java中总是不可变的,所以如果没有涉及本机代码的丑陋的黑客,就无法销毁它们。

受信任的证书与不受信任的证书没有什么不同。是的,你可以从里面取回公钥。私钥通常与导致私钥所属的叶用户证书的证书链一起存储。但是,私钥是,而不是证书的一部分,因此不能从它检索私钥。不过,这是可以的,私钥应该建立在需要私钥的位置;除了备份之外,不需要传输私钥。

如何将证书发送给接收方取决于您。棘手的部分是让接收方信任证书。使用预先建立的密钥(如可信的PGP密钥)是有效的。如果你没有这样的钥匙,那你就有麻烦了。您可以做的是使用其他方法来建立信任。让对方打电话给您,然后验证证书指纹(基本上只是证书上的散列)是否正确,这可能是最简单的方法之一。当然,如果你的用户离你不远,亲自带过来也是一种选择。

不过,你不能凭空创建一个安全的通道。如果你不能信任对方,那么建立完全信任显然是不可能的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61266333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档