以文本格式存储由 KeyStoreGenerator 生成的私钥(例如保管库存储)-Java

出于安全目的,我正在使用以下代码创建公钥和私钥。


public KeyGenerator(int keylength) throws NoSuchAlgorithmException, NoSuchProviderException {

    this.keyGen = KeyPairGenerator.getInstance("RSA");

    this.keyGen.initialize(keylength);

}


public void createKeys() {

    this.pair = this.keyGen.generateKeyPair();

    this.privateKey = pair.getPrivate();

    this.publicKey = pair.getPublic();

}


public PrivateKey getPrivateKey() {

    return this.privateKey;

}


public PublicKey getPublicKey() {

    return this.publicKey;

}


public void writeToFile(String path, byte[] key) throws IOException {

    File f = new File(path);

    f.getParentFile().mkdirs();


    FileOutputStream fos = new FileOutputStream(f);

    fos.write(key);

    fos.flush();

    fos.close();

}


public static void main(String[] args) {

    KeyGenerator kg;

    try {

        kg = new KeyGenerator(2048);

        kg.createKeys();

        System.out.println(kg.getPublicKey().getFormat()); // this prints out X.509


        System.out.println(kg.getPrivateKey().getFormat()); // this prints out PKCS#8


        kg.writeToFile(PUBLIC_KEY_PATH, kg.getPublicKey().getEncoded());

        kg.writeToFile(PRIVATE_KEY_PATH, kg.getPrivateKey().getEncoded());

    } catch (NoSuchAlgorithmException | NoSuchProviderException e) {

        System.err.println(e.getMessage());

    } catch (IOException e) {

        System.err.println(e.getMessage());

    }


}

我需要找到一种方法将私钥(如下图所示)按以下格式存储在保管库中。当我用文本编辑器打开密钥时,我得到如下内容。

http://img.mukewang.com/61666597000156be04050196.jpg

有没有办法将此 PKCS#8 转换为适合存储在文件中的编码?



慕妹3242003
浏览 211回答 2
2回答

30秒到达战场

请注意,关于getFormat Javadoc,这是 ASN.1 标准格式:返回此键的主要编码格式的名称,如果此键不支持编码,则返回 null。如果此密钥的 ASN.1 规范存在,则主要编码格式根据适当的 ASN.1 数据格式命名。例如,公钥的ASN.1数据格式的名称是SubjectPublicKeyInfo,由X.509标准定义;在这种情况下,返回的格式是“X.509”。同样,私钥的 ASN.1 数据格式的名称是 PrivateKeyInfo,由 PKCS #8 标准定义;在这种情况下,返回的格式是“PKCS#8”。但是,如果我们出于某种原因需要更改它,我们可以使用 Bouncy Castle:例如:&nbsp; //Convert to PKCS#1&nbsp; PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(kg.getPrivateKey().getEncoded());&nbsp; ASN1Encodable encodable = pkInfo.parsePrivateKey();&nbsp; ASN1Primitive primitive = encodable.toASN1Primitive();&nbsp; byte[] privateKeyPKCS1 = primitive.getEncoded();&nbsp; //kg.writeToFile(PRIVATE_KEY_PATH, privateKeyPKCS1);&nbsp; //Convert to PEM&nbsp; PemObject pemObject = new PemObject("RSA PRIVATE KEY", privateKeyPKCS1);&nbsp; StringWriter stringWriter = new StringWriter();&nbsp; PemWriter pemWriter = new PemWriter(stringWriter);&nbsp; pemWriter.writeObject(pemObject);&nbsp; pemWriter.close();&nbsp; String pemString = stringWriter.toString();&nbsp; kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());我们会得到一个这样的文件:-----BEGIN RSA PRIVATE KEY-----&nbsp;MIIEpQIBAAKCAQEAr76DpCYkQKMCKRyjx9wyVKihU4vSBeTq7VpkJx9g616AUTtIyzMZyHa2vVucgkZL9VFS+ZwJZk7b6pNUUSwnwKxHFnRndid2Hum1ZZZCzRYwhsKq. . .&nbsp;XIA+HTgaXbEsCyDcX7EWVlpnTzq5ASO2llKT8V0Mswyh2fznbm5nH92fUKUku2nL&nbsp;VAQC2f8PL2eLec3wmb0ZWBazadakMC1fVH3umiBmFnkyDoEfojdOgSo=-----END RSA PRIVATE KEY-----我使用了这个 BouncyCastle 版本:<dependency>&nbsp; <groupId>org.bouncycastle</groupId>&nbsp; <artifactId>bcprov-jdk15on</artifactId>&nbsp; <version>1.60</version></dependency>这个问题讨论了同样的问题,但对于公钥编码:Generating RSA keys in PKCS#1 format in Java感谢@dave_thompson_085 的评论,我意识到使用JcaMiscPEMGenerator类的另一种方法&nbsp; JcaMiscPEMGenerator generator = new JcaMiscPEMGenerator(kg.getPrivateKey());&nbsp; stringWriter = new StringWriter();&nbsp; pemWriter = new PemWriter(stringWriter);&nbsp; pemWriter.writeObject(generator.generate());&nbsp; pemWriter.close();&nbsp; pemString = stringWriter.toString();&nbsp; kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());要使用它,我们需要添加以下依赖项:<dependency>&nbsp; <groupId>org.bouncycastle</groupId>&nbsp; <artifactId>bcpkix-jdk15on</artifactId>&nbsp; <version>1.60</version></dependency>

千巷猫影

现在我已经花了几个小时,我觉得很愚蠢..我会把答案放在这里。所以问题是我想将其存储为字符串(在文本文件中存储二进制文件的内容 - 就像上图所示的那个)如果您使用的是基于 Unix 的系统,您可以通过以下方式轻松获得:base64&nbsp;filename.key&nbsp;>&nbsp;string.txt现在,如果您想恢复二进制文件,就像:base64&nbsp;-D&nbsp;string.txt&nbsp;>&nbsp;filename-clone.key所以这不是java相关的问题
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java