2017-03-09 176 views
0

我目前在我的android應用程序中存儲了一個RSA密鑰,它將用於用戶應用程序數據的應用程序加密。密鑰庫在哪裏?

我生成密鑰,並將其存儲保存爲像這樣的按鍵目錄中的文件:

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

當我去找回我在調試模式下的Android密鑰庫,我得到一個錯誤,說明該文件不存在(無效的目錄)。我想知道如果存儲路徑被設置爲那個鍵實際存儲在哪裏?

代碼來檢索密鑰對:

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

什麼是filePath設置爲?這就是你存儲密鑰到 – dweebo

回答

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

在你執行這條線,你應該執行這一個:

filePath.mkdirs(); 

目前,它有可能是目錄「鍵」沒有按」並不存在,而且你沒有做任何事情來確保它的確存在。

您還需要在存儲密鑰庫之後關閉輸出流。看起來你也忽略了某個地方的IOExceptionFileNotFoundException

+0

嗨,路徑已經創建,並且它在檢索密鑰庫而不是創建密鑰庫方面失敗。歡呼 – James

+0

所以'別名'的值與您創建它時的值不同。當然,根本不需要'alias'作爲文件名的一部分,因爲密鑰庫可以包含多個別名。您可以使用固定的文件名,例如'System.getProperty(「user.dir」)+「/.keystore」'。當然,如果您已經擁有密鑰對和證書,您爲什麼還需要密鑰庫文件? – EJP

+0

嗨,我需要密鑰庫,以便每次重新加載應用程序時我都可以保留相同的密鑰對和證書,而不是每次擦除數據並重新生成它 – James

相關問題