2016-04-19 10 views
9

SecretKeyを使用して、自分のアプリケーションの機密データを暗号化します。現在私は秘密鍵をBase64でエンコードされた形式でDBまたはSharedPrefsに保管していますが、これはルートされた電話機にSecretを格納する安全な場所ではありません。したがって、私は秘密鍵をAndroid KeyStoreに移したいと思う。私が直面している問題は、Googleからthis sample codeを試すと、SecretKeyの代わりにPrivateKeyが必要になることです。 SecretKeyをKeyStoreに保存し、後で使用できるようにフェッチする方法を理解できませんでした。Android:KeyStoreにSecretKeyを保存する

private static void writeSecretKeyToKeystore(SecretKey secretKey, Context context) { 
KeyStore keyStore = null; 
try { 
    keyStore = KeyStore.getInstance("AndroidKeyStore"); 
    keyStore.load(null); 
    KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); 
    keyStore.setKeyEntry("Key", secretKeyEntry.getSecretKey().getEncoded(), null); 
} catch (KeyStoreException e) { 
    e.printStackTrace(); 
} catch (CertificateException e) { 
    e.printStackTrace(); 
} catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

私は、コードの上にしようとすると、それが例外をスローOperation not supported because encoding is unknown:私はこれを試してみました。

サンプルコードはすごく役立ちます。

+0

次を試してください:keyStore.setEntry( "Key"、secretKeyEntry、null); –

+0

「第2引数のタイプが間違っています」と言ってコンパイルしません。 「SecretKeyEntry」が見つかりました。必須の 'byte []' 'です。 – Rajkiran

+0

'setKeyEntry'を 'setEntry'に変更してください。 –

答えて

5

WRONG
java.security.KeyStoreクラスは、両方の対称および非対称キーを格納することができます。あなたは、コンストラクタであなたのSecretKeyを渡すKeyStore.SecretKeyEntryをインスタンス化し、それを保存するキーストア#1 setEntryメソッドを使用する必要があります。

keyStore.setEntry(
    "key1", 
    new KeyStore.SecretKeyEntry(secretKey), 
    new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
      .setBlockMode(KeyProperties.BLOCK_MODE_GCM) 
      .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) 
      .build()); 

使用からそれを取り戻すために:

SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null); 

UPDATE
いくつかの調査の後、私はAndroidKeyStoreが対称キーをサポートしていないことに驚いていました。 (議論を参照してください:https://groups.google.com/forum/#!topic/android-developers/gbmIRKRbfq8

+0

KeyStoreにSecretKeyEntryオブジェクトを受け入れるメソッドがありません。また、あなたの答えには、エントリを設定する方法以上のエントリを取得する方法が記載されています。更新された質問を確認してください。 – Rajkiran

+0

両方のメソッド(getEntryとsetEntry)はKeyStore.Entryインターフェイスを処理します(http://developer.android.com/reference/java/security/KeyStore.Entry.htmlを参照)。 KeyStore.SecretKeyEntryはこのインタフェースを実装しているので、KeyStore.Entryが期待されるどこでも使用できます。 –

+1

これはAPI <23では動作しません。私はLollipopから始まるアプリを開発しています。私はこのコードを使用します。keyStore.setEntry( "key1"、新しいKeyStore.SecretKeyEntry(secretKey)、新しいKeyStoreParameter.Builder(コンテキスト).setEncryptionRequired(true).build());しかしそれはうまくいかないでしょう。 あなたの答えをUpvoted。 – Rajkiran

関連する問題