我正在研究使用适用于Marshmallow及以上的Android KeyStore。
我想通过使用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)。我将密码/密钥存储在“安全地点”,例如Android密钥库。 B)。我使用“最强”的加密技术。 C)。我想同时验证数据完整性和数据验证,例如我想检测一下我的加密数据是否被篡改过。
据我了解我所读到的关于HMAC的内容,他们提供了这项功能。我想知道如何将HMAC的使用编码到我的Android应用程序中,以确保数据完整性和数据身份验证。
答案 0 :(得分:6)
您可以在加密之前将HMAC应用于纯文本HMAC(plain text)
,并在解密后重新计算HMAC以检查原始消息是否相同。
这可能是多余的,因为如果密文被更改,您将无法对其进行解密。
首先在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);