2016-04-19 35 views
9

Uygulamamdaki hassas verileri şifrelemek için SecretKey kullanıyorum. Şu anda SecretKey'i Base64 kodlu formatta DB veya SharedPrefs'te saklıyorum, bu gizli bir telefonda Secret saklamak için güvenli bir yer değil. Bu yüzden, SecretKey'imi Android KeyStore'a taşımak istiyorum. Karşılaştığım sorun, Google'dan this sample code'u denediğimde, SecretKey yerine bir PrivateKey bekler. SecretKey'imi KeyStore'da saklamak ve daha sonra kullanmak üzere almak için bir yol bulamadım.Android: SecretKey'i KeyStore'da saklayın

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

Ben kodunun üzerinde çalıştığınızda, istisna Operation not supported because encoding is unknown atar: Bu çalıştı.

Örnek kodlar çok yardımcı olabilir.

+0

aşağıdakileri deneyin: keyStore.setEntry ("Key", secretKeyEntry, null); –

+0

Yanlış 2. argüman türü söyleyerek derleme yapmaz. 'SecretKeyEntry' bulundu; gerekli 'bayt []' '. – Rajkiran

+0

Lütfen 'setKeyEntry' öğesini 'setEntry' olarak değiştirin. –

cevap

5

yanlış
java.security.KeyStore hem simetrik hem de asimetrik anahtarları depolayabilir.

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

kullanım dışarı geri almak için::

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

GÜNCELLEME Sadece kaydetmek için KeyStore # setEntry yöntemi kullanmak sonra yapıcı içinde Elinden SecretKey geçen KeyStore.SecretKeyEntry örneğini ve gerek
Bazı araştırmalardan sonra, AndroidKeyStore'un simetrik anahtarları desteklemediğini fark ettim. (bkz. tartışma: https://groups.google.com/forum/#!topic/android-developers/gbmIRKRbfq8)

+0

SecretKeyEntry nesnesini kabul eden KeyStore'da herhangi bir yöntem göremiyorum. Ayrıca, cevabınız, girişin nasıl ayarlanacağından daha fazlasına nasıl girileceğinden bahseder. Lütfen güncellenmiş sorumu kontrol edin. – Rajkiran

+0

her iki yöntem de (GetEntry ve setEntry) KeyStore.Entry arabirimiyle ilgilenir (bkz: http://developer.android.com/reference/java/security/KeyStore.Entry.html). KeyStore.SecretKeyEntry bu arabirimi uygular, böylece KeyStore.Entry'nin beklendiği her yerde kullanabilirsiniz. –

+1

Bu API <23 üzerinde çalışmayacak. Lollipop ile başlayan bir uygulama geliştiriyorum. Bu kodu keyStore.setEntry ("key1"), yeni KeyStore.SecretKeyEntry (secretKey), yeni KeyStoreParameter.Builder (context) .setEncryptionRequired (true) .build()); ama işe yaramazdı. Yine de cevabınız kesildi. – Rajkiran