2017-03-09 13 views
0

私は現在、アンドロイドアプリケーションに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)); 

あなたはこの行を実行する前に、あなたはこの1つを実行する必要があります。現時点では

filePath.mkdirs(); 

をそれがそのディレクトリ 'キー' doesnの可能性あり存在していることを確認することについて何もしていません。

また、キーストアを保存した後に出力ストリームを閉じる必要があります。どこかでIOExceptionまたはFileNotFoundExceptionも無視しているようです。

+0

に保存しているところです。こんにちは、パスは既に作成されており、キーストアの作成ではなく、キーストアの取得に失敗しています。 Cheers – James

+0

'alias'は作成時と同じ値を持ちません。もちろん、キーストアには複数のエイリアスを含めることができるので、ファイル名の一部として 'alias'は必要ありません。固定のファイル名(例: 'System.getProperty(" user.dir ")+" /.keystore "'となります。もちろん、鍵ペアと証明書をすでに持っている場合、なぜキーストアファイルが必要なのでしょうか? – EJP

+0

こんにちは、私はデータを拭くと毎回それを再生成するのではなく、アプリケーションをリロードするたびに同じ鍵ペアと証明書を保持できるようにキーストアが必要です – James

関連する問題