为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3242003 2021-10-13 12:50:10
出于安全目的,我正在使用以下代码创建公钥和私钥。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());    }}我需要找到一种方法将私钥(如下图所示)按以下格式存储在保管库中。当我用文本编辑器打开密钥时,我得到如下内容。有没有办法将此 PKCS#8 转换为适合存储在文件中的编码?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

请注意,关于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:例如:


  //Convert to PKCS#1

  PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(kg.getPrivateKey().getEncoded());

  ASN1Encodable encodable = pkInfo.parsePrivateKey();

  ASN1Primitive primitive = encodable.toASN1Primitive();

  byte[] privateKeyPKCS1 = primitive.getEncoded();

  //kg.writeToFile(PRIVATE_KEY_PATH, privateKeyPKCS1);


  //Convert to PEM

  PemObject pemObject = new PemObject("RSA PRIVATE KEY", privateKeyPKCS1);

  StringWriter stringWriter = new StringWriter();

  PemWriter pemWriter = new PemWriter(stringWriter);

  pemWriter.writeObject(pemObject);

  pemWriter.close();

  String pemString = stringWriter.toString();

  kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());

我们会得到一个这样的文件:


-----BEGIN RSA PRIVATE KEY----- 

MIIEpQIBAAKCAQEAr76DpCYkQKMCKRyjx9wyVKihU4vSBeTq7VpkJx9g616AUTtI

yzMZyHa2vVucgkZL9VFS+ZwJZk7b6pNUUSwnwKxHFnRndid2Hum1ZZZCzRYwhsKq

. . . 

XIA+HTgaXbEsCyDcX7EWVlpnTzq5ASO2llKT8V0Mswyh2fznbm5nH92fUKUku2nL 

VAQC2f8PL2eLec3wmb0ZWBazadakMC1fVH3umiBmFnkyDoEfojdOgSo=

-----END RSA PRIVATE KEY-----

我使用了这个 BouncyCastle 版本:


<dependency>

  <groupId>org.bouncycastle</groupId>

  <artifactId>bcprov-jdk15on</artifactId>

  <version>1.60</version>

</dependency>

这个问题讨论了同样的问题,但对于公钥编码:Generating RSA keys in PKCS#1 format in Java


感谢@dave_thompson_085 的评论,我意识到使用JcaMiscPEMGenerator类的另一种方法


  JcaMiscPEMGenerator generator = new JcaMiscPEMGenerator(kg.getPrivateKey());

  stringWriter = new StringWriter();

  pemWriter = new PemWriter(stringWriter);

  pemWriter.writeObject(generator.generate());

  pemWriter.close();

  pemString = stringWriter.toString();

  kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());

要使用它,我们需要添加以下依赖项:


<dependency>

  <groupId>org.bouncycastle</groupId>

  <artifactId>bcpkix-jdk15on</artifactId>

  <version>1.60</version>

</dependency>


查看完整回答
反对 回复 2021-10-13
?
千巷猫影

TA贡献1829条经验 获得超7个赞

现在我已经花了几个小时,我觉得很愚蠢..我会把答案放在这里。

所以问题是我想将其存储为字符串(在文本文件中存储二进制文件的内容 - 就像上图所示的那个)

如果您使用的是基于 Unix 的系统,您可以通过以下方式轻松获得:

base64 filename.key > string.txt

现在,如果您想恢复二进制文件,就像:

base64 -D string.txt > filename-clone.key

所以这不是java相关的问题


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 210 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信