Comment stocker la clé de Android à l'aide de la Clé Fournisseur de Magasin

Je suis en train d'utiliser l'Android Magasin de Clés Fournisseur, qui est devenu disponible sous Android 4.3 sécurisé pour enregistrer une Clé Privée et d'utiliser ensuite cette clé privée pour chiffrer et décoder les données.

Je pense que j'ai mis en œuvre l'approche correcte et le code pour cette mesure, cependant, je suis actuellement confronté à un étrange problème que je ne peux pas comprendre.

J'ai une classe appelée KeyStorage que j'utilise pour créer la paire de Clés, de charger le fichier de clés et de récupérer la clé privée, le code de cette classe est comme suit:

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

J'ai ensuite une classe appelée CredentialStore que j'essaie de l'utiliser dans. J'ai créer un alias appelé "MySecureKey" et d'essayer de créer et de stocker une clé privée sur cette base. Donc, comme vous pouvez le voir j'ai essayer de créer la nouvelle paire de Clés basé sur l'Alias de charger le fichier de clés et enfin récupérer la clé Privée. Toutefois, il ne fonctionne pas.

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

Je obtenir les journaux comme suit:

Aliases = MySecureKey
Could not find key alias: MySecureKey

Alors quand j'ai vérifier les alias dans le loadKeyStore méthode, on dirait que c'est là-bas qu'il est de retour dans le journal. Cependant, lorsque j'essaie de l'appeler à l'aide de la loadKeyStore méthode je reçois le journal en disant qu'il ne peut pas trouver la clé "MySecureKey".

Je ne peux pas trouver une raison à cela et à la recherche en ligne s'est avérée infructueuse, donc je me demandais si quelqu'un a une idée de ce qui pourrait mal se passer?

1. Vous générez de la paire de Clés et de ne pas en faire usage. Votre generateNewKeyPair méthode ne retourne rien. 2. Vous n'épargnez rien pour fichier de clés à la charge plus tard. veuillez vous référer à un exemple de fichier de clés useage. Il peut vous aider developer.android.com/samples/BasicAndroidKeyStore/index.html
bien que le nombre de upvotes, votre commentaire est faux: découvrez l'officiel de la doc: developer.android.com/training/articles/... c'est la façon dont vous utilisez le Android Keystore - il n'est pas nécessaire de mettre la clé explicitement si vous utilisez le KeyFactory avec l'Android fichier de stockage des clés de l'instance.

OriginalL'auteur Donal Rafferty | 2014-09-25