gpt4 book ai didi

Java - 在 KeyStore 中存储 key 对

转载 作者:行者123 更新时间:2023-12-01 17:27:14 25 4
gpt4 key购买 nike

我正在实现一个混合加密项目,并且我已经为发送者和接收者 key (私有(private)和公共(public))生成了 2 个 key 对。我将这些 key 保存在一个文件中。

key 对生成代码

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;

import Decoder.BASE64Encoder;

public class GenerateRSAKeys{

public static void main(String[] args)
{



String publicKeyFilename = null;
String privateKeyFilename = null;

publicKeyFilename = "C:\\Users\\imjme1\\Desktop\\Work_backup\\FMS\\EPM_FILE_ENCRYPTION\\NIFT_SOLUTION\\sender_keys\\receiver_publicKey";
privateKeyFilename = "C:\\Users\\imjme1\\Desktop\\Work_backup\\FMS\\EPM_FILE_ENCRYPTION\\NIFT_SOLUTION\\sender_keys\\receiver_privateKey";

GenerateRSAKeys generateRSAKeys = new GenerateRSAKeys();

generateRSAKeys.generate(publicKeyFilename, privateKeyFilename);

}

private void generate (String publicKeyFilename, String privateFilename){

try {

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

// Create the public and private keys
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
BASE64Encoder b64 = new BASE64Encoder();

SecureRandom random = createFixedRandom();
generator.initialize(1024, random);

KeyPair pair = generator.generateKeyPair();
Key pubKey = pair.getPublic();
Key privKey = pair.getPrivate();

System.out.println("publicKey : " + b64.encode(pubKey.getEncoded()));
System.out.println("privateKey : " + b64.encode(privKey.getEncoded()));

BufferedWriter out = new BufferedWriter(new FileWriter(publicKeyFilename));
out.write(b64.encode(pubKey.getEncoded()));
out.close();

out = new BufferedWriter(new FileWriter(privateFilename));
out.write(b64.encode(privKey.getEncoded()));
out.close();


}
catch (Exception e) {
System.out.println(e);
}
}

public static SecureRandom createFixedRandom()
{
return new FixedRand();
}

private static class FixedRand extends SecureRandom {

MessageDigest sha;
byte[] state;

FixedRand() {
try
{
this.sha = MessageDigest.getInstance("SHA-1");
this.state = sha.digest();
}
catch (NoSuchAlgorithmException e)
{
throw new RuntimeException("can't find SHA-1!");
}
}

public void nextBytes(byte[] bytes){

int off = 0;

sha.update(state);

while (off < bytes.length)
{
state = sha.digest();

if (bytes.length - off > state.length)
{
System.arraycopy(state, 0, bytes, off, state.length);
}
else
{
System.arraycopy(state, 0, bytes, off, bytes.length - off);
}

off += state.length;

sha.update(state);
}
}
}

}

现在,我需要保护这些 key (可能不是直接位于任何磁盘上)。

我在网上搜索过这个案例;将 key 保存到 key 存储中是保护 key 的方法,并在读取用于加密和解密的 key 时使用相同的 key 存储。

有人可以建议我如何在 key 存储中保存公钥和私钥以及如何在java中读取它吗?

最佳答案

Java KeyStore API (和底层提供程序)不支持存储 key 对——即私钥和公钥(然后可用于加密和验证等公钥操作)。它确实支持存储私钥和公​​钥的证书链。证书链只能包含一个证书,特别是当该证书是自签名证书时(根据定义,它本身就是一个链)。这正是命令行 keytool -genkeypair 的作用:它生成一个 key 对,并将私钥以及公钥的自签名证书存储在(指定或默认) keystore 文件中。

如果您仅使用“标准”JRE,则在代码中创建自签名(或其他)证书并不容易。

但是,如果您添加了 BouncyCaSTLe,正如您显然所做的那样,或者您发布的代码将无法工作,那么它具有许多适用的功能。有关仅使用 bcprov(旧的、已弃用的 X509V3CertificateGenerator)生成证书的简单示例,请参阅我的 JAVA API to create a keystore and attaching a csr and keypair to it -- 但按照我在那里建议但没有显示的操作:不要先创建不需要的 CSR,而是使用所需的名称和公钥创建证书。

更好的是,如果您还拥有或可以获得 bcpkix,请使用 X509v3CertificateBuilder。请参阅 Self signed X509 Certificate with Bouncy Castle in Java 中的示例和 Generating X509 Certificate using Bouncy Castle Java

要写出和读回包含此数据的 keystore 文件,只需参阅上面链接的 Javadoc。注意 Java 传统上默认为 JKS 格式文件,您会在这里和网络上的其他地方找到许多旧的答案,这些答案都假设,但自 2017 年 Java 9 开始,它默认为 PKCS12 格式,这不仅是标准的,因此(大多数情况下)可互操作,而且更安全(使用更好的 PBKDF 算法)。

但是,您的代码使用了完全伪造的随机生成器,因此每次都会生成相同的 key 对。鉴于此,实际上没有必要存储它,因为您可以随时重新生成它。事实上,即使拥有这个 key 对也没有任何好处,因为它根本不提供任何安全性

关于Java - 在 KeyStore 中存储 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61195028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com