Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何存储密钥对并在其他类中使用它进行解密?_Java_Encryption_Public Key Encryption_Key Pair - Fatal编程技术网

Java 如何存储密钥对并在其他类中使用它进行解密?

Java 如何存储密钥对并在其他类中使用它进行解密?,java,encryption,public-key-encryption,key-pair,Java,Encryption,Public Key Encryption,Key Pair,我正在尝试加密字符串值,这些值将通过postman发送到@RestController中的@PostMapping方法,并将它们存储在数据库中 这是我加密字符串的代码 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(1024); keyPair = keyPairGenerator.gener

我正在尝试加密字符串值,这些值将通过postman发送到@RestController中的@PostMapping方法,并将它们存储在数据库中

这是我加密字符串的代码

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

        keyPairGenerator.initialize(1024);

        keyPair = keyPairGenerator.generateKeyPair();           

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");


        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());

        encrypted = cipher.doFinal(this.toBeEncrypted.getBytes("UTF-8"));
然后我将这个加密变量存储到数据库中

我有另一个类对存储在数据库中的字符串进行解密,但它不会对加密值进行解密,我知道这是因为它没有正确的密钥进行解密

我尝试将密钥对设置为静态变量,以便我的自定义类StringEncryptor和StringDecryptor使用相同的密钥对对象,但在服务器重新启动时会停止正常工作,因此我相信当服务器重新启动时,我用来加密/解密的静态密钥对对象被重新初始化,因此这不是锁定字符串变量的密钥

我不确定,但我认为我应该存储我锁定字符串对象的密钥,这样我以后可以在其他类中再次使用它来解锁加密的字符串

互联网上的大多数教程都是关于密码算法的,其他的则是用同样的方法对文件进行解密,这在现实项目中是完全无用的,这不是我想要的

我需要知道如何存储和存储在哪里,以及如何再次检索这些密钥进行解密


提前感谢。

密钥管理本身就是一个完整的主题。我希望您已经发现,将密钥保存在RAM中不是一种选择

通常,您会尝试将密钥放入密钥存储。此密钥存储可能由硬件支持。在这种情况下,实际的私钥操作也需要在硬件中进行,否则必须取出密钥。在最简单的形式中,密钥可以简单地从密码保护的密钥存储中检索,这意味着对于最新版本的Java来说是一个与PKCS12兼容的文件。现在您可以存储密钥,但问题是您必须在重新启动时输入密码

此外,通常Java密钥库实现还需要证书和私钥一起提供,所以您必须为私钥生成或请求证书。有许多教程介绍如何从密钥对创建自签名证书。这是因为Java严重依赖PKIX,PKIX是根据美国ANSI标准的公钥基础设施,它都以字母X开头,比如X.509,它定义了常见的TLS/CMS证书的外观


好的,现在您知道应该朝哪个方向看了,恐怕您必须从现在开始研究如何管理您的密钥。

您使用非对称加密有什么原因吗?从我读到的内容来看,它与执行en-/解密的应用程序相同。对于这些场景,对称密码(例如AES)更合适。@LeonardBrünings,谢谢你提到对称密码,我切换到AES,现在很酷。谢谢你的回答,起初我不太理解,但经过一些研究,我觉得它有意义。你能告诉我更多关于证书的情况吗?比如,我应该将什么作为证书[]传递到私钥旁边的密钥库?在一个证书数组中,我应该向PrivateKeyEntry构造函数传递多少个证书?这些证书应该包含什么?提前感谢您应该传递一个证书链,其中证书由父证书的私钥签名,直至保存私钥的叶证书。该叶证书应该具有用于加密的密钥用法,因为这是您的目的。您还可以使用自签名证书,在这种情况下,您的证书当然也应该对签名证书有效。有许多方法可以使用OpenSSL生成PKCS12密钥存储,然后可以在Java中使用。这可能比使用Java或JDK中的keytool命令生成它更容易。所有其他信息实际上都由您决定-它们本质上是您的详细信息。姓名、有效期等。