2010-07-03 7 views
3

Je dois stocker une clé publique et une clé privée dans une base de données sqlite. En fait, je écrire le pubKey.getEncoded() dans la base de données, et de recréer le pubkey i utilise le code suivant:JAVA - Comment stocker et lire une clé publique RSA à partir d'un sqlite db

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); 

mais il me donne l'erreur suivante

Exception dans le thread "principal" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: détecter prématuré EOF

à ce stade:

pubKey = (RSAPublicKey) rsaKeyFac.generatePublic (cléSpec);

Quelqu'un peut-il m'aider?

Nous vous remercions à l'avance

Répondre

0
  1. Lorsque vous obtenez un ResultSet, le curseur pointe vers l'espace avant la première ligne des résultats. Vous devez donc appeler next() avant d'essayer de récupérer les données.

  2. Vous devez vous assurer que la requête a réussi.

+0

vous avez raison, mais rien n'a changé, l'erreur est toujours présente la requête fonctionne correctement – michele

2

Si vous regardez ici: http://java.sun.com/docs/books/tutorial/jdbc/basics/retrieving.html, vous verrez comment récupérer correctement à partir d'un DB. C'est en supposant que vous avez un type de char (n) pour votre colonne DB.

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); 
} 

Si le type est un BLOB ou un CLOB, vous devez utiliser un mécanisme différent. http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/blob.html

+0

Ce devrait être un BLOB. Le codage getEncoded() utilisé produit des octets qui peuvent et s'étendent sur toute la plage de 0x00 à 0xff, et ne peuvent pas être stockés en tant que données de caractères ou de chaînes. –

+0

Romain: Votre code est très similaire au mien, et le résultat est similaire aussi, ça ne marche pas. Même exception – michele

+0

GregS: J'ai essayé avec le type blob, de la manière suivante: > result.next(); KeyFactory rsaKeyFac = null; rsaKeyFac = KeyFactory.getInstance ("RSA"); Blob pukey = result.getBlob (1); int leng = (int) pukey.length(); X509EncodedKeySpec keySpec = nouveau X509EncodedKeySpec (pukey.getBytes (1, leng)); RSAPublicKey pubKey; pubKey = (RSAPublicKey) rsaKeyFac.generatePublic (keySpec); J'ai une nouvelle exception qui dit: java.sql.SQLException: pas implémenté par le pilote SQLite JDBC donc je pense que l'exception blob est une limitation sqlite. Mais le problème persiste, je ne suis pas capable de récupérer le pubkey! – michele

Questions connexes