2017-03-09 2 views
0

Je suis actuellement stocker une clé RSA dans mon application Android, il doit être utilisé pour le cryptage in-app des données de l'application utilisateur.Où se trouve le fichier de clés?

Je Générez la clé et le stocker de l'enregistrer sous forme de fichier dans le répertoire clés comme ceci:

public RSA(char[] password) throws Exception 
{ 
    private static final String filePath = System.getProperty("user.dir") + "/keys/"; 
    mCurrentPassword = password; 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    File possibleKeyFile = new File(filePath + "/" + keyAlias); 
    //FileInputStream keyFile = new FileInputStream(filePath + "/" + keyAlias); 

    if(!possibleKeyFile.exists()) //if keystore is empty, create a key 
    { 
     mCurrentCertificate = generateCert(); 
     //Store the new keypair 
     ks.load(null, password); 

     KeyStore.ProtectionParameter protParam = 
       new KeyStore.PasswordProtection(password); 

     java.security.cert.Certificate[] myCert = 
       new java.security.cert.Certificate[] { 
         (java.security.cert.Certificate) mCurrentCertificate 
       }; 

     KeyStore.PrivateKeyEntry pkEntry = 
       new KeyStore.PrivateKeyEntry(mCurrentRSAKeyPair.getPrivate(), 
         myCert); 

     ks.setEntry(keyAlias, pkEntry, protParam); 
     OutputStream os = new FileOutputStream(new File(filePath + "/" + keyAlias)); 

     ks.store(os , password); 

    } 
    else 
    { 
     //retrieve keypair and assign it to mCurrentKeyPair 
     mCurrentRSAKeyPair = getKey(keyAlias, password); 
    } 
} 

Quand je vais récupérer le fichier de clés sur mon android en mode débogage je reçois une erreur indiquant le fichier n'existe pas (répertoire non valide). Je me demande où la clé est réellement stockée si le chemin de stockage est défini comme ça?

Code

pour récupérer keypair:

private static KeyPair getKey(String alias, char[] password) throws Exception 
{ 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    FileInputStream keyFile = new FileInputStream(filePath + "/" + alias); 
    ks.load(keyFile, password); 

    KeyStore.ProtectionParameter protParam = 
      new KeyStore.PasswordProtection(password); 

    KeyStore.PrivateKeyEntry privateKeyEntry = 
      (KeyStore.PrivateKeyEntry) ks.getEntry(alias, protParam); 
    RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey(); 
    //get public key from private key 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class); 
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537)); 
    PublicKey publicKey = kf.generatePublic(keySpec); 

    KeyPair kp = new KeyPair(publicKey, privateKey); 

    return kp; 
} 
+0

A quoi sert le paramètre filePath? C'est ce que vous stockez la clé à – dweebo

Répondre

0
OutputStream os = new FileOutputStream(new File(filePath + "/" + keyAlias)); 

Avant d'exécuter cette ligne, vous devez exécuter celui-ci:

filePath.mkdirs(); 

À l'heure actuelle, il est possible que le répertoire 'clés' n » Il existe, et vous ne faites rien pour vous assurer que cela fonctionne.

Vous devez également fermer le flux de sortie après avoir stocké le fichier de clés. Il semble que vous ignoriez également un IOException ou FileNotFoundException quelque part.

+0

Bonjour, le chemin est déjà créé et il échoue sur la récupération du fichier de clés et non sur la création du fichier de clés. Bravo – James

+0

Donc 'alias' n'a pas la même valeur que lorsque vous l'avez créé. Bien sûr, vous n'avez pas du tout besoin d'utiliser 'alias' comme partie du nom de fichier, car les fichiers de clés peuvent contenir plusieurs alias. Vous pouvez simplement utiliser un nom de fichier fixe, par ex. 'System.getProperty (" user.dir ") +" /.keystore "'. Et bien sûr, si vous avez déjà la paire de clés et le certificat, pourquoi avez-vous besoin du fichier keystore? – EJP

+0

Salut, j'ai besoin du keystore pour conserver la même paire de clés et le même certificat chaque fois que je recharge l'application au lieu d'effacer les données et de les régénérer à chaque fois – James