2010-07-03 69 views
3

我必须将公钥和私钥存储到sqlite数据库中。 其实我写的pubKey.getEncoded()到数据库中,并重新创建我使用下面的代码PUBKEY:JAVA-如何从sqlite数据库中存储和读取RSA公钥密码

ResultSet result = stat.executeQuery("select publickey from cert where id='1'"); 
    KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA"); 
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(result.getBytes(1)); 
    RSAPublicKey pubKey; 
    pubKey = (RSAPublicKey) rsaKeyFac.generatePublic(keySpec); 

,但它给了我下面的错误

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

在这一点上:

pubKey =(RSAPublicKey)rsaKeyFac.generatePublic(keySpec);

任何人都可以帮到我吗?

预先感谢您

回答

0
  1. 当你第一次得到一个结果,将光标指向空间之前结果的第一行。所以你需要在尝试检索数据之前调用next()。

  2. 您应该确保查询真正成功。

+0

你说得对,但没有任何变化,错误仍然存​​在 查询正常工作 – michele 2010-07-03 17:26:01

2

如果你看这里:http://java.sun.com/docs/books/tutorial/jdbc/basics/retrieving.html你会看到如何正确检索数据库。假设你的数据库列有一个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,那么您需要使用不同的机制。 http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/blob.html

+0

它应该是一个BLOB。所使用的getEncoded()编码产生的字节数超过了可以使用的范围,并且将覆盖从0x00到0xff的整个范围,并且不能存储为字符或字符串数​​据。 – 2010-07-04 15:32:44

+0

Romain: 您的代码与我的代码非常相似,结果也是类似的,它不起作用。同样的例外。 – michele 2010-07-04 23:54:36

+0

GregS: 我用blob类型尝试过,方法如下: > result.next(); KeyFactory rsaKeyFac = null; rsaKeyFac = KeyFactory.getInstance(“RSA”); Blob pukey = result.getBlob(1); int leng =(int)pukey.length(); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pukey.getBytes(1,leng)); RSAPublicKey pubKey; pubKey =(RSAPublicKey)rsaKeyFac.generatePublic(keySpec); 我有一个新的例外说: java.sql.SQLException:没有实施的SQLite JDBC驱动程序 所以我认为blob异常是一个sqlite的限制。 但问题仍然存在,我无法找回公钥! – michele 2010-07-04 23:55:30