2017-10-20 14 views
8

マシュマロ以上のAndroid KeyStoreの使用を調査しています。Androidキーストアでキー付きハッシュメッセージ認証コード(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); 

を生成するために、このサンプルを発見しました私のデータ?

EXPLANATION

私は任意のAndroidアプリケーション内のセキュリティ/暗号化を実装するときに作るために選択/決定事項の数を持っています。

1)。はいまたはいいえ、どのような種類の暗号化を実装していますか? 2)。はいの場合は...可能な限り「安全な」ソリューションを実現するようにしなければなりません。

暗号を使用する場合は、次のことを確認する必要があります。

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(plain text)にHMACを適用してから、復号化後にHMACを暗号化して再計算して元のメッセージが同じであることを確認できます。

暗号テキストが変更された場合、暗号テキストを復号化できないため、冗長性がある可能性があります。

まず、AndroidKeyStoreの内部にHMACキーを生成します。私はHMACを再計算し、両方のMacが等しいチェック、たとえば次に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キーを取得した

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

関連する問題