如何使用带 Android 密钥库的密钥散列消息身份验证代码 (HMAC)
How to employ keyed-hash message authentication code (HMAC) with Android Keystore
我正在研究 Android KeyStore for Marshmallow 及更高版本的使用。
我想通过使用 HMAC 同时验证数据的完整性和身份验证。
我该如何实现这一目标?
我目前正在生成一个 Encrypt/Decrypt 密钥,如下所示:-
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);
但是,encrypting/decrypting 我的数据如何使用它?
解释
在任何 Android 应用程序中实施 security/cryptography 时,我有许多 choices/decisions 要做。
1).我是否实施任何类型的密码术是或否?
2).如果是,那么...我应该尝试实现 "most" 可能的安全解决方案。
如果我要使用密码学,那么我需要确保以下内容。
a).我将 passwords/secret 键存储在 "Safe Place" 中,例如Android 密钥库。
b).我使用可用的 "strongest" 密码术。
C)。我想同时验证数据的完整性和数据的身份验证,例如我想检测我的加密数据是否被篡改
据我了解我所阅读的有关 HMAC 的内容,它们提供了此功能。我想知道如何将 HMAC 的使用编码到我的 Android 应用程序中以确保数据完整性和数据验证。
您可以在加密前将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);
我正在研究 Android KeyStore for Marshmallow 及更高版本的使用。
我想通过使用 HMAC 同时验证数据的完整性和身份验证。
我该如何实现这一目标?
我目前正在生成一个 Encrypt/Decrypt 密钥,如下所示:-
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);
但是,encrypting/decrypting 我的数据如何使用它?
解释
在任何 Android 应用程序中实施 security/cryptography 时,我有许多 choices/decisions 要做。
1).我是否实施任何类型的密码术是或否? 2).如果是,那么...我应该尝试实现 "most" 可能的安全解决方案。
如果我要使用密码学,那么我需要确保以下内容。
a).我将 passwords/secret 键存储在 "Safe Place" 中,例如Android 密钥库。 b).我使用可用的 "strongest" 密码术。 C)。我想同时验证数据的完整性和数据的身份验证,例如我想检测我的加密数据是否被篡改
据我了解我所阅读的有关 HMAC 的内容,它们提供了此功能。我想知道如何将 HMAC 的使用编码到我的 Android 应用程序中以确保数据完整性和数据验证。
您可以在加密前将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);