我正在研究棉花糖及更高版本的Android KeyStore的使用。

我想通过使用HMAC同时验证数据完整性和数据身份验证。

我该如何实现这一目标?

我目前正在生成一个加密/解密 key ,如下所示:

        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)。如果是,那么...我应该尝试实现“最”安全​​的解决方案。

如果要使用密码学,则需要确保以下内容。

一个)。我将密码/ secret key 存储在“安全位置”,例如Android keystore 。
b)。我使用可用的“最强”加密。
C)。我想同时验证数据完整性和我的数据的身份验证,例如我想检测我的加密数据是否已被篡改。

据我了解的有关HMAC的了解,它们提供了此功能。我想知道如何将HMAC的使用编码到我的Android应用程序中,以确保数据完整性和数据身份验证。

最佳答案

您可以在加密之前将HMAC应用于纯文本HMAC(plain text),并在解密后重新计算HMAC,以检查原始消息是否相同。

这可能是多余的,因为如果密文被更改,您将无法对其进行解密。

首先在AndroidKeyStore内生成一个HMAC key 。我找到了一个示例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 ,重新计算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 - 如何在Android Keystore中使用键哈希消息身份验证代码(HMAC),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46849794/

10-12 00:28
查看更多