2017-10-20 23 views
8

Tôi đang điều tra việc sử dụng Android KeyStore cho Marshmallow trở lên.Cách sử dụng mã xác thực thông báo băm có khóa (HMAC) với Android Keystore

Tôi muốn đồng thời xác minh cả tính toàn vẹn dữ liệu và xác thực dữ liệu của mình bằng cách sử dụng HMAC.

Tôi làm cách nào để đạt được điều này?

Tôi hiện nay tạo ra một chìa khóa Encrypt/Decrypt như sau: -

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

Tôi đã tìm thấy mẫu này để tạo ra HMAC của

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

Tuy nhiên, làm thế nào để sử dụng này khi mã hóa/giải mã dữ liệu của tôi?

GIẢI THÍCH

Tôi có một số lựa chọn/quyết định để thực hiện khi thực hiện an ninh/mật mã trong bất kỳ ứng dụng Android.

1). Tôi có thực hiện mật mã của bất kỳ loại Có hoặc Không? 2). Nếu có thì ... tôi nên cố gắng đạt được giải pháp "an toàn nhất" có thể.

Nếu tôi định sử dụng mật mã thì tôi cần đảm bảo những điều sau đây.

a). Tôi lưu trữ mật khẩu/khóa bí mật trong "Địa điểm an toàn", ví dụ: Cửa hàng khóa Android. b). Tôi sử dụng mật mã "mạnh nhất". c). Tôi muốn đồng thời xác minh cả tính toàn vẹn dữ liệu và xác thực dữ liệu của tôi, ví dụ: Tôi muốn phát hiện xem dữ liệu được mã hóa của tôi có bị can thiệp hay không.

Khi tôi hiểu những gì tôi đã đọc về HMAC, chúng cung cấp chức năng này. Tôi muốn biết làm thế nào tôi mã việc sử dụng HMAC vào ứng dụng Android của tôi để đảm bảo tính toàn vẹn dữ liệu và xác thực dữ liệu của tôi.

+1

Bạn có muốn áp dụng HMAC cho văn bản mã hóa không? Nó có thể thừa vì nếu văn bản mật mã bị thay đổi, nó sẽ không thể giải mã được. Mục đích cuối cùng là gì? – pedrofb

+0

@pedrofb, Có Tôi muốn áp dụng HMAC cho văn bản mật mã của tôi.Mặc dù Nếu tôi hiểu việc sử dụng HMAC, tôi không đồng thời mã hóa và áp dụng HMAC vào văn bản thuần tuý của tôi để lấy văn bản được mã hóa cũng được "bảo vệ" bởi HMAC đã áp dụng của tôi chưa? – Hector

+1

Nếu bạn áp dụng HMAC cho bản mã 'HMAC (mã hóa (văn bản thuần túy))', bạn phải xác minh nó trước khi giải mã. Nếu bạn áp dụng HMAC cho văn bản thuần túy 'HMAC (văn bản thuần túy), mã hóa (văn bản thuần túy) 'thì bạn phải xác minh MAC sau khi giải mã, để kiểm tra xem thư gốc có thực sự giống nhau không. – pedrofb

Trả lời

6

Bạn có thể áp dụng HMAC cho văn bản thuần túy HMAC(plain text) trước khi mã hóa và tính toán lại HMAC sau khi giải mã để kiểm tra xem thư gốc có giống nhau hay không.

Nó có thể thừa vì nếu văn bản mật mã bị thay đổi, bạn sẽ không thể giải mã được.

Trước tiên, tạo khóa HMAC bên trong AndroidKeyStore. Tôi tìm thấy một ví dụ 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(); 

Sau đó Apply HMAC với dữ liệu gốc và lưu trữ kết quả ở đâu đó

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

Sau khi giải mã, lấy chìa khóa HMAC từ AndroidKeyStore, recompute HMAC và kiểm tra cả Mac đều bình đẳng

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

công việc tuyệt vời. Cảm ơn thời gian và nỗ lực của bạn – Hector

Các vấn đề liên quan