我正在尝试对通过邮递员发送到@PostMapping
中的@RestController
方法的String值进行加密并将其存储在数据库中。
这是我用于加密字符串的代码
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
使用相同的密钥对对象,但是在服务器重新启动时它无法正常工作,因此我相信,当服务器重新启动时,用于加密/解密的静态KeyPair对象将重新初始化,因此它不是锁定String变量的键。
我不确定,但是我认为应该存储用来锁定String对象的密钥,以便以后可以在其他类中再次使用它来解锁加密的Strings。
Internet上的大多数教程都是关于密码算法的,其他教程则以相同的方法解密加密文件,这在现实世界的项目中完全没有用,这不是我想要的。
我需要知道如何存储以及在哪里存储以及如何再次取回这些密钥以进行解密。
谢谢。
答案 0 :(得分:1)
密钥管理本身就是一个完整的主题。我希望您已经发现,将密钥保留在RAM中不是一种选择。
通常,您会尝试将密钥放入密钥库中。此密钥存储区可能由硬件支持。在这种情况下,实际的私钥操作也需要在硬件中进行,否则您将必须取出密钥。以最简单的形式,可以简单地从受密码保护的密钥存储中检索密钥(对于最新版本的Java,这意味着与PKCS#12兼容的文件)。现在您可以存储密钥,但是问题是您必须在重新启动时输入密码。
此外,通常Java KeyStore
实现也需要在私钥中包含证书,因此您必须为私钥生成或请求证书。关于如何从密钥对创建自签名证书的教程很多。这是因为Java在很大程度上依赖于PKIX,它是根据美国ANS(I)标准的公钥基础结构,它们都以字母X开头(例如X.509,它定义了通用的TLS / CMS证书的样子)。>
好的,所以现在您知道应该注意什么方向了,恐怕您将不得不从这里进行一些有关如何管理密钥的研究。