java - 如何创建 RSA key 对以便将其存储在数据库中?

标签 java rsa

我正在尝试实现一个变异加密算法(理论上由我开发),作为要求的一部分,我需要生成一个 RSA key 对并将其存储在数据库中,以便稍后可以检索它作为加密过程(仅用于加密 session key ,以便它可以与加密消息一起安全发送)。

我尝试生成 RSA key 对似乎有效,但它会一遍又一遍地生成相同的值,而不是每次运行代码时都提供新的 key 对。我做错什么了? 此外,如果这些值取决于机器本身(因此显示相同的值),是否有一种方法可以将 key 对生成链接到提供的电子邮件地址,以便每次输入新电子邮件地址时都会输出不同的 RSA key 对?

以下代码是我尝试生成 key 对:

import java.security.*;
import java.security.*;
/**
 * @author Speedy gonzales
 */
public class test {

    public static void main(String[] args) throws NoSuchAlgorithmException,        NoSuchProviderException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024);

        byte[] publicKey = keyGen.genKeyPair().getPublic().getEncoded();
        StringBuffer retString1 = new StringBuffer();
        retString1.append("[");

        for (int puk = 0; puk < publicKey.length; ++puk) {
            retString1.append(publicKey[puk]);
           // retString1.append(", ");
        }
        retString1 = retString1.delete(retString1.length()-2,retString1.length());
        retString1.append("]");
        System.out.println(retString1);

          byte[] privateKey = keyGen.genKeyPair().getPrivate().getEncoded();
        StringBuffer retString2 = new StringBuffer();
        retString2.append("[");

        for (int pri = 0; pri < privateKey.length; ++pri) {
            retString2.append(privateKey[pri]);
           // retString2.append(", ");
        }
        retString2 = retString2.delete(retString2.length()-2,retString2.length());
        retString2.append("]");
        System.out.println(retString2); 
    }
}

谢谢

最佳答案

那么,你的第一个问题是:

keyGen.genKeyPair().getPublic().getEncoded();
keyGen.genKeyPair().getPrivate().getEncoded();

您没有保存 key 对,因此您生成的公钥和私钥不匹配。在 javadocs 中,genKeyPair() 的行为如下:

This will generate a new key pair every time it is called.

其次,getEncoded() 只是将 key 作为字节数组返回。如果您的数据库可以存储二进制值,就以这种方式存储它。否则,您可能会以某种方式将它转换为 String 的运气要好得多。例如,您可以使用这个巧妙的小技巧对其进行 base 64 编码(可能比您正在做的更可靠):

String keyAsString = new BigInteger(publicKey.getEncoded()).toString(64);

您随后可以通过以下方式取回原始字节:

byte[] bytes = new BigInteger(keyAsString, 64).toByteArray();

你说你每次运行都得到相同的值(并在为此烦恼之前确保你是),我不是 100% 确定为什么。您应该能够访问算法参数(您可能必须将 key 转换为不同的类型),尝试打印这些参数以查看它们是否相同。有人提到检查您的随机数生成器,这可能也是个好主意。

关于java - 如何创建 RSA key 对以便将其存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11939992/

相关文章:

java - 如何使用结构进行冒泡排序

certificate - ASN1。序列 vs 集合

c# - 使用 openSSL 生成自签名 RSA-2048-SHA-256 证书 PFX 文件

java - 检测耳机是否已插入Java的耳机插孔中

java - 当数字是随机时捕获子字符串中的不同值 - Selenium Java

java - Kotlin lang 上 android.arch.lifecycle 的 Android 致命异常

java - 如何使用 OpenAPI 3.0 创建同一请求的多个版本?

windows - 在 Windows 下使用 GIT with/SSH key 文件的问题

java - 如何调整 C# 的公钥/私钥 RSA key 以像在 Java 中一样使用它们?

c# - RSA:在 javascript 中加密密码但无法在 C# 中解密