2017-10-20 87 views
8

我正在研究使用Android KeyStore for Marshmallow及以上版本。如何在Android Keystore中使用keyed-hash消息認證碼(HMAC)

我想通過採用HMAC來同時驗證數據完整性和數據驗證。

我該如何去做到這一點?

我電流產生的加密/解密密鑰如下: -

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

我發現這個樣本生成HMAC的

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

但是,我怎麼使用這個加密時/解密我的數據?

說明

我有很多的選擇/決定任何Android應用程序中實現安全性/密碼時進行。

1)。我是否實施任何類型的密碼術是或否? 2)。如果是,那麼......我應該嘗試實現「最」安全​​的解決方案。

如果我要採用密碼術,那麼我需要確保以下內容。 a)。

a)。我將密碼/密鑰存儲在「安全位置」中,例如Android密鑰存儲。 b)。我使用可用的「最強」加密技術。 c)。我想同時驗證數據的完整性和我的數據的身份驗證,例如我想檢測我的加密數據是否被篡改。

據我瞭解我已閱讀​​有關HMAC的,他們提供此功能。我想知道如何將HMAC的使用編碼到我的Android應用程序中,以確保數據完整性和我的數據的身份驗證。

+1

是否要將HMAC應用於密文?這可能是多餘的,因爲如果密文被改變,它將不能被解密。什麼是最終目的? – pedrofb

+0

@pedrofb,是的,我想將HMAC應用於我的密文。雖然如果我理解使用HMAC,我不會同時加密並將HMAC應用於我的純文本,以獲得也由我的應用HMAC「保護」的加密文本? – Hector

+1

如果您將HMAC應用於密文'HMAC(加密(純文本));'您必須在解密之前對其進行驗證。如果您將HMAC應用於純文本「HMAC(純文本);加密(純文本)」,則必須在解密後驗證MAC,以檢查原始消息是否真的相同。 – pedrofb

回答

6

您可以在解密後加密並重新計算HMAC以檢查原始消息是否相同之前,將HMAC應用於純文本HMAC(plain text)

它可能是多餘的,因爲如果密文被改變,你將無法解密它。

首先在AndroidKeyStore內部生成一個HMAC密鑰。我發現了一個例子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(); 

然後應用HMAC原始數據,並將結果存入某處

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

解密後,得到AndroidKeyStore HMAC密鑰,重新計算HMAC和檢查兩臺Mac相等

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

不錯的工作。感謝您的時間和努力 – Hector

相關問題