2017-10-20 45 views
8

Badam wykorzystanie KeyStore Android dla Marshmallow i wyżej.Jak używać klucza uwierzytelniania z hasłem klucza (HMAC) za pomocą Android Keystore

Chciałbym jednocześnie zweryfikować zarówno integralność danych, jak i uwierzytelnianie moich danych przez zastosowanie HMAC.

Jak mogę to osiągnąć?

Jestem obecny generowania klucza szyfrowania/odszyfrowywania w następujący sposób: -

 mKeyStore = KeyStore.getInstance(keyStoreName); 
     mKeyStore.load(mKeyStoreLoadStoreParameter); 

     if (mKeyStore.containsAlias(keyStoreAlias)) { 
      mSecretKey = (SecretKey) mKeyStore.getKey(keyStoreAlias, KEY_STORE_PASSWORD); 
     } else { 
      final KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, keyStoreName); 
      final int keyPurpose = KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT; 

      keyGenerator.init(
        new KeyGenParameterSpec.Builder(keyStoreAlias, keyPurpose) 
          .setKeySize(KEY_STORE_KEY_SIZE) 
          .setBlockModes(KeyProperties.BLOCK_MODE_GCM) 
          .setRandomizedEncryptionRequired(true) 
          .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) 
          .build()); 

      mSecretKey = keyGenerator.generateKey(); 

Znalazłem tę próbkę do generowania HMAC na

SecretKey key = ...; // HMAC key of algorithm "HmacSHA512". 

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
keyStore.setEntry(
     "key1", 
     new KeyStore.SecretKeyEntry(key), 
     new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build()); 
// Key imported, obtain a reference to it. 
SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null); 
// The original key can now be discarded. 

Mac mac = Mac.getInstance("HmacSHA512"); 
mac.init(keyStoreKey); 

Jednak, jak mogę to wykorzystać podczas szyfrowania/deszyfrowania moje dane?

WYJAŚNIENIE

Mam liczbę wyborów/decyzji, aby przy wdrażaniu zabezpieczeń/kryptografii w dowolnej aplikacji Android.

1). Czy wdrażam jakąkolwiek kryptografię Tak lub Nie? 2). Jeśli tak, to powinienem spróbować osiągnąć "najbardziej" bezpieczne rozwiązanie.

Jeśli będę używać kryptografii, muszę się upewnić, że:

a). Przechowuję hasła/tajne klucze w "bezpiecznym miejscu", np. Android Key Store. b). Używam "najsilniejszej" dostępnej kryptografii. c). Chciałbym jednocześnie zweryfikować zarówno integralność danych, jak i uwierzytelnianie moich danych, np. Chciałbym wykryć, czy moje zaszyfrowane dane zostały zmodyfikowane.

Jak rozumiem, co przeczytałem na temat HMAC, zapewniają tę funkcję. Chciałbym wiedzieć, w jaki sposób zakodowuję wykorzystanie HMAC w mojej aplikacji Android, aby zapewnić integralność danych i uwierzytelnianie moich danych.

+1

Czy chcesz zastosować HMAC do tekstu zaszyfrowanego? Może być zbędny, ponieważ jeśli tekst szyfrowania zostanie zmieniony, nie będzie można go odszyfrować. Jaki jest ostateczny cel? – pedrofb

+0

@pedrofb, Tak Chcę zastosować HMAC do mojego tekstu szyfrowania.Chociaż jeśli rozumiem użycie HMAC, czy jednocześnie nie szyfruje i nie stosuje HMAC do mojego zwykłego tekstu w celu uzyskania zaszyfrowanego tekstu, który jest również "chroniony" przez mój zastosowany HMAC? – Hector

+1

Jeśli zastosujesz HMAC do zaszyfrowanego 'HMAC (encrypt (plain text));' musisz go zweryfikować przed odszyfrowaniem. Jeśli zastosujesz HMAC do zwykłego tekstu 'HMAC (zwykły tekst), encrypt (zwykły tekst)', musisz zweryfikować MAC po odszyfrowaniu, aby sprawdzić, czy oryginalna wiadomość jest naprawdę taka sama. – pedrofb

Odpowiedz

6

Możesz zastosować HMAC do zwykłego tekstu HMAC(plain text) przed szyfrowaniem i ponownym obliczeniem HMAC po odszyfrowaniu, aby sprawdzić, czy oryginalna wiadomość jest taka sama.

Może być zbędny, ponieważ jeśli tekst szyfrowania zostanie zmieniony, nie będzie można go odszyfrować.

Najpierw wygeneruj klucz HMAC wewnątrz AndroidKeyStore. Znalazłem przykład here

KeyGenerator keyGenerator = KeyGenerator.getInstance(
     KeyProperties.KEY_ALGORITHM_HMAC_SHA256, "AndroidKeyStore"); 
keyGenerator.initialize(
     new KeyGenParameterSpec.Builder(hmacKeyAlias, KeyProperties.PURPOSE_SIGN).build()); 
SecretKey key = keyGenerator.generateKey(); 

następnie zastosować HMAC do oryginalnych danych i zapisać wynik gdzieś

Mac mac = Mac.getInstance("HmacSHA256"); 
mac.init(key); 
byte hmacOriginalData[] = mac.doFinal(dataToEncrypt); 
//Store hmacOriginalData 

Po odszyfrowaniu, dostać klucz HMAC z AndroidKeyStore, przeliczyć HMAC i sprawdzić oba macs są równe

Key key = keyStore.getKey(hmacKeyAlias, null); 
Mac mac = Mac.getInstance("HmacSHA256"); 
mac.init(key); 
byte hmacDecryptedData[] = mac.doFinal(decryptedData); 
//Check equals(hmacDecryptedData, hmacOriginalData); 
+0

dobra robota. Dziękuję za poświęcony czas i wysiłek – Hector