我想使用Android 4.3中可用的Android密鑰存儲提供程序來安全地保存私鑰,然後使用此私鑰來加密和解碼數據。如何使用Android密鑰存儲提供程序存儲密鑰
我想我已經實現了正確的方法和代碼,但目前我面臨着一個奇怪的問題,我無法弄清楚。
我有一個叫KeyStorage類,我用它來創建密鑰對,加載密鑰庫和檢索私鑰,這個類的代碼如下:
public class KeyStorage {
public static final String ANDROID_KEYSTORE = "AndroidKeyStore";
private KeyStore keyStore;
public void loadKeyStore() {
try {
keyStore = KeyStore.getInstance(ANDROID_KEYSTORE);
keyStore.load(null);
Enumeration<String> aliases = keyStore.aliases();
while(aliases.hasMoreElements())
Log.e("E", "Aliases = " + aliases.nextElement());
} catch (Exception e) {
// TODO: Handle this appropriately in your app
e.printStackTrace();
}
}
public void generateNewKeyPair(String alias, Context context)
throws Exception {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
// expires 1 year from today
end.add(1, Calendar.YEAR);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
.setAlias(alias)
.setSubject(new X500Principal("CN=" + alias))
.setSerialNumber(BigInteger.TEN)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
// use the Android keystore
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", ANDROID_KEYSTORE);
gen.initialize(spec);
// generates the keypair
gen.generateKeyPair();
}
public PrivateKey loadPrivteKey(String alias) throws Exception {
if (keyStore.isKeyEntry(alias)) {
Log.e("E", "Could not find key alias: " + alias);
return null;
}
KeyStore.Entry entry = keyStore.getEntry(EnhancedCredentialStore.KEY_ALIAS, null);
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.e("E", " alias: " + alias + " is not a PrivateKey");
return null;
}
return ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
}
然後我也稱爲類CredentialStore,我嘗試使用它。我創建了一個名爲「MySecureKey」的別名,並嘗試在此基礎上創建和存儲私鑰。正如你所看到的,我嘗試基於Alias加載密鑰庫來創建新的密鑰對,然後最終檢索私鑰。但它不起作用。
public class CredentialStore {
public static final String KEY_ALIAS = "MySecureKey";
private KeyStorage KeyStorage;
public CredentialStore(Activity context){
keyStorage = new KeyStorage();
try {
keyStorage.generateNewKeyPair(KEY_ALIAS, context);
} catch (Exception e) {
e.printStackTrace();
}
blueBirdKeyStorage.loadKeyStore();
try {
keyStorage.loadPrivteKey(KEY_ALIAS);
} catch (Exception e) {
e.printStackTrace();
}
}
我得到的日誌如下:
Aliases = MySecureKey
Could not find key alias: MySecureKey
所以,當我檢查別名在loadKeyStore方法,它看起來像它的存在,因爲它是回來在日誌中。但是,當我嘗試使用loadKeyStore方法調用它時,我得到日誌說它無法找到密鑰「MySecureKey」。
我找不到任何理由和網上研究已證明無果,所以我想知道如果有人有任何想法可能會出錯?
1.您生成KeyPair並且不使用它。您的generateNewKeyPair方法不會返回任何內容。 2.您不會將任何內容保存到KeyStore以稍後加載它。請參考KeyStore使用示例。它可以幫助你http://developer.android.com/samples/BasicAndroidKeyStore/index.html – 2014-09-25 16:25:48
@AlexanderZhak儘管許多upvotes,你的評論是錯誤的:檢查官方文檔:https://developer.android.com/ training/articles/keystore.html#UserAuthentication這就是您如何使用Android Keystore--如果您將KeyFactory與Android Keystore實例一起使用,則不需要明確地放置該密鑰。 – for3st 2016-09-21 11:51:22