2010-07-03 71 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