Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA-如何从sqlite数据库存储和读取RSA公钥_Java_Security_Rsa - Fatal编程技术网

JAVA-如何从sqlite数据库存储和读取RSA公钥

JAVA-如何从sqlite数据库存储和读取RSA公钥,java,security,rsa,Java,Security,Rsa,我必须将公钥和私钥存储到sqlite数据库中。 实际上,我将pubKey.getEncoded()写入数据库,为了重新创建pubKey,我使用以下代码: 但它给了我以下的错误 线程“main”java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:检测过早的EOF 在这一点上: pubKey=(RSAPublicKey)rsaKeyFac.generatePublic(key

我必须将公钥和私钥存储到sqlite数据库中。 实际上,我将pubKey.getEncoded()写入数据库,为了重新创建pubKey,我使用以下代码:

但它给了我以下的错误

线程“main”java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:检测过早的EOF

在这一点上:

pubKey=(RSAPublicKey)rsaKeyFac.generatePublic(keySpec)

有人能帮我吗

先谢谢你

  • 第一次获取结果集时,光标指向第一行结果之前的空间。因此,在尝试检索数据之前,需要对其调用next()

  • 您应该确保查询实际成功

  • 如果您看这里:您将看到如何正确地从数据库中检索。这是假设您的DB列有一种char(n)类型

    ResultSet result = stat.executeQuery("select publickey from cert where id='1'");
    while(result.next())
    {
       KeyFactory rsaKeyFac =  KeyFactory.getInstance("RSA");
       X509EncodedKeySpec keySpec = new X509EncodedKeySpec(result.getString(1));
       RSAPublicKey pubKey;
       pubKey = (RSAPublicKey) rsaKeyFac.generatePublic(keySpec);
    }
    
    如果类型是BLOB或CLOB,则需要使用不同的机制。

    你说得对,但没有任何变化,错误仍然存在。查询正常工作。它应该是一个BLOB。使用的getEncoded()编码产生的字节数超过了可以产生的字节数,并且将跨越从0x00到0xff的整个范围,并且不能作为字符或字符串数据存储。Romain:您的代码与我的代码非常相似,结果也很相似,它不起作用。相同的异常。GregS:我尝试了blob类型,方法如下:>result.next();KeyFactory rsaKeyFac=null;rsaKeyFac=KeyFactory.getInstance(“RSA”);Blob pukey=result.getBlob(1);int leng=(int)pukey.length();X509EncodedKeySpec=newx509encodedkeyspec(pukey.getBytes(1,leng));RSAPublicKey-pubKey;pubKey=(RSAPublicKey)rsaKeyFac.generatePublic(keySpec);我有一个新的异常,它说:java.sql.SQLException:不是由SQLite JDBC驱动程序实现的,所以我认为blob异常是SQLite的限制。但问题仍然存在,我无法检索pubkey@米歇尔:如果pubkey存储为字符对象,那么它可能已被进程损坏。字符集是有限的,但公钥字节可以具有任何值。公钥应该存储为二进制类型,可能是BLOB。在MySQL中,有一种
    VARBINARY
    类型用于存储二进制数据。
    ResultSet result = stat.executeQuery("select publickey from cert where id='1'");
    while(result.next())
    {
       KeyFactory rsaKeyFac =  KeyFactory.getInstance("RSA");
       X509EncodedKeySpec keySpec = new X509EncodedKeySpec(result.getString(1));
       RSAPublicKey pubKey;
       pubKey = (RSAPublicKey) rsaKeyFac.generatePublic(keySpec);
    }