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?
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
Vous devez vous connecter pour publier un commentaire.
Pourquoi est-il blueBirdKeyStore:
Ne devrait-elle pas être:
Aussi, vous n'avez pas utilisé le "alias" dans votre loadPrivateKey():
Maintenant, je ne suis pas sûr, mais ne devriez-vous pas être à l'aide de la "alias" dans le présent?
OriginalL'auteur Sid
Votre méthode pour vérifier si votre clé existe est erronée:
Selon la javadoc
.isKeyEntry()
a le comportement suivantmais votre clé n'a pas été créé par
setEntry()
. Je suppose que si vous venez de charger la clé avecil n'est pas null.
Voici un exemple complet avec des méthodes simples sur la façon d'utiliser le Android fichier de clés avec pré-M et M Api.
OriginalL'auteur patrickf
loadPrivateKey dans votre classe n'utilise pas le "alias" pour récupérer la clé. C'est à l'aide d'une autre classe est constante, donc je ne suis pas sûr de ce qui vous attend ici.
OriginalL'auteur