【问题标题】:How to store a keypair and use it in other classes for decryption?如何存储密钥对并在其他类中使用它进行解密?
【发布时间】:2019-09-11 00:48:11
【问题描述】:

我正在尝试加密通过邮递员发送到@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"));

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

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

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

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

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

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

提前致谢。

【问题讨论】:

  • 有什么原因,您使用的是非对称加密吗?根据我的阅读,它与执行加密/解密的应用程序相同。对于这些场景,对称密码(例如 AES)更适合。
  • @LeonardBrünings,谢谢你提到对称,我切换到 AES,现在很酷。

标签: java encryption public-key-encryption key-pair


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢你的回答,起初我不太明白,但经过一些研究,对我来说很有意义。你能告诉我更多关于证书的信息吗?就像我应该将私有密钥旁边的密钥库作为证书 [] 传递给什么?我应该将证书数组中的多少个证书传递给 PrivateKeyEntry 构造函数?这些证书应该包含什么?提前致谢
  • 您应该传递一系列证书,其中证书由父证书的私钥签名,直到持有您的私钥的叶证书。该叶证书应该具有用于​​加密的密钥用途,因为这是您的目的。您还可以使用 自签名 证书,当然,在这种情况下,您的证书也应该对签名证书有效。有许多方法可以使用 OpenSSL 生成 PKCS#12 密钥库,然后您可以在 Java 中使用这些方法。这可能比使用 Java 或 JDK 中的 keytool 命令生成它更容易。
  • 所有其他信息完全取决于您 - 它们本质上是您的详细信息。姓名、有效期等
猜你喜欢
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2014-02-22
  • 2017-09-13
  • 2014-11-07
  • 2023-03-08
相关资源
最近更新 更多