我正在研究使用Android KeyStore for Marshmallow及以上版本。如何在Android Keystore中使用keyed-hash消息認證碼(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);
但是,我怎麼使用這個加密時/解密我的數據?
說明
我有很多的選擇/決定任何Android應用程序中實現安全性/密碼時進行。
1)。我是否實施任何類型的密碼術是或否? 2)。如果是,那麼......我應該嘗試實現「最」安全的解決方案。
如果我要採用密碼術,那麼我需要確保以下內容。 a)。
a)。我將密碼/密鑰存儲在「安全位置」中,例如Android密鑰存儲。 b)。我使用可用的「最強」加密技術。 c)。我想同時驗證數據的完整性和我的數據的身份驗證,例如我想檢測我的加密數據是否被篡改。
據我瞭解我已閱讀有關HMAC的,他們提供此功能。我想知道如何將HMAC的使用編碼到我的Android應用程序中,以確保數據完整性和我的數據的身份驗證。
是否要將HMAC應用於密文?這可能是多餘的,因爲如果密文被改變,它將不能被解密。什麼是最終目的? – pedrofb
@pedrofb,是的,我想將HMAC應用於我的密文。雖然如果我理解使用HMAC,我不會同時加密並將HMAC應用於我的純文本,以獲得也由我的應用HMAC「保護」的加密文本? – Hector
如果您將HMAC應用於密文'HMAC(加密(純文本));'您必須在解密之前對其進行驗證。如果您將HMAC應用於純文本「HMAC(純文本);加密(純文本)」,則必須在解密後驗證MAC,以檢查原始消息是否真的相同。 – pedrofb