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

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


这是我用于加密字符串的代码


        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"));

然后我将此encrypted变量存储到数据库中。


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


我尝试创建KeyPair一个静态变量,以便我的两个自定义类,StringEncryptor并StringDecryptor使用相同的密钥对对象,但是当服务器重新启动时,它会停止正常工作,所以我相信当服务器重新启动时,我用来加密/解密的静态密钥对对象被重新初始化,因此这不是锁定 String 变量的键。


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


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


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


提前致谢。


慕盖茨4494581
浏览 81回答 1
1回答

智慧大石

密钥管理本身就是一个完整的主题。我希望您已经发现,将密钥保存在 RAM 中并不是一种选择。通常,您会尝试将密钥放入密钥库中。该密钥存储可以由硬件支持。在这种情况下,实际的私钥操作也需要在硬件中进行,否则您必须取出密钥。在最简单的形式中,可以简单地从受密码保护的密钥存储中检索密钥(这意味着最新版本的 Java 的 PKCS#12 兼容文件)。现在您可以存储密钥,但问题是您必须在重新启动时输入密码。此外,通常 JavaKeyStore实现还需要与私钥一起提供证书,因此您必须为私钥生成或请求证书。有许多关于如何从密钥对创建自签名证书的教程。这是因为 Java 严重依赖 PKIX,即根据美国 ANS(I) 标准的公钥基础设施,这些标准均以字母 X 开头(例如 X.509,它定义了常见的 TLS / CMS 证书的外观)。好的,现在您知道应该看什么方向了,恐怕您必须从这里开始对如何管理密钥进行一些研究。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java