如何存储密钥对并在其他 类 中使用它进行解密?
How to store a keypair and use it in other classes for decryption?
我正在尝试加密通过邮递员发送到 @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
变量存储到数据库中。
我有另一个 class 可以解密存储在数据库中的字符串,但它不会解密加密值,我知道那是因为它没有正确的密钥它。
我尝试将 KeyPair
设为静态变量,因此我的自定义 classes、StringEncryptor
和 StringDecryptor
使用相同的密钥对对象,但它停止工作当服务器重新启动时正确,所以我相信当服务器重新启动时,我用来 encrypt/decrypt 的静态 KeyPair 对象会被重新初始化,所以这不是锁定 String 变量的键。
我不确定,但我觉得我应该存储用于锁定字符串对象的密钥,这样我以后可以在其他 classes 中再次使用它来解锁加密的字符串。
互联网上的大部分教程都是关于密码算法的,其他人用同样的方法解密加密文件,这在现实世界的项目中完全没用,这不是我要找的。
我需要知道如何存储和存储在哪里以及如何再次检索这些密钥以进行解密。
提前致谢。
密钥管理本身就是一个完整的话题。我希望您已经发现将密钥保存在 RAM 中不是一种选择。
通常您会尝试将密钥放在密钥库中。该密钥库可能由硬件支持。在那种情况下,实际的私钥操作也需要在硬件中进行,否则您必须取出密钥。在最简单的形式中,可以简单地从 受密码保护的 密钥存储中检索密钥(这意味着最新版本的 Java 的 PKCS#12 兼容文件)。现在您可以存储密钥,但问题是您必须在重新启动时输入密码。
此外,通常 Java KeyStore
实现还需要证书与私钥一起出现,因此您必须为您的私钥生成或请求证书。有很多关于如何从密钥对创建自签名证书的教程。这是因为 Java 严重依赖 PKIX,根据美国 ANS(I) 标准的 public 关键基础设施,它们都以字母 X 开头(例如 X.509 定义了常见的 TLS / CMS 证书看起来像)。
好的,现在你知道应该看什么方向了,恐怕你必须从这里开始研究如何管理你的密钥。
我正在尝试加密通过邮递员发送到 @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
变量存储到数据库中。
我有另一个 class 可以解密存储在数据库中的字符串,但它不会解密加密值,我知道那是因为它没有正确的密钥它。
我尝试将 KeyPair
设为静态变量,因此我的自定义 classes、StringEncryptor
和 StringDecryptor
使用相同的密钥对对象,但它停止工作当服务器重新启动时正确,所以我相信当服务器重新启动时,我用来 encrypt/decrypt 的静态 KeyPair 对象会被重新初始化,所以这不是锁定 String 变量的键。
我不确定,但我觉得我应该存储用于锁定字符串对象的密钥,这样我以后可以在其他 classes 中再次使用它来解锁加密的字符串。
互联网上的大部分教程都是关于密码算法的,其他人用同样的方法解密加密文件,这在现实世界的项目中完全没用,这不是我要找的。
我需要知道如何存储和存储在哪里以及如何再次检索这些密钥以进行解密。
提前致谢。
密钥管理本身就是一个完整的话题。我希望您已经发现将密钥保存在 RAM 中不是一种选择。
通常您会尝试将密钥放在密钥库中。该密钥库可能由硬件支持。在那种情况下,实际的私钥操作也需要在硬件中进行,否则您必须取出密钥。在最简单的形式中,可以简单地从 受密码保护的 密钥存储中检索密钥(这意味着最新版本的 Java 的 PKCS#12 兼容文件)。现在您可以存储密钥,但问题是您必须在重新启动时输入密码。
此外,通常 Java KeyStore
实现还需要证书与私钥一起出现,因此您必须为您的私钥生成或请求证书。有很多关于如何从密钥对创建自签名证书的教程。这是因为 Java 严重依赖 PKIX,根据美国 ANS(I) 标准的 public 关键基础设施,它们都以字母 X 开头(例如 X.509 定义了常见的 TLS / CMS 证书看起来像)。
好的,现在你知道应该看什么方向了,恐怕你必须从这里开始研究如何管理你的密钥。