Android Keymaster 是一种用于加密和解密数据的 Android API,它可以在设备的安全硬件中生成、存储和管理密钥
- 添加 Keymaster 依赖项: 在您的 Android 项目中,首先需要在 build.gradle 文件中添加 Keymaster 库的依赖项。请确保您的项目支持 AndroidX。
dependencies { implementation 'androidx.security:security-keymaster-core:3.0.0' }
- 初始化 Keymaster: 在您的应用程序中使用 Keymaster 之前,需要先初始化 Keymaster。这通常在应用程序的 Application 类或者主 Activity 中完成。
import androidx.security.keymaster.KeymasterManager; import androidx.security.keymaster.KeyProperties; public class MyApplication extends Application { private KeymasterManager keymasterManager; @Override public void onCreate() { super.onCreate(); keymasterManager = (KeymasterManager) getSystemService(Context.KEYMASTER_SERVICE); } }
- 生成密钥: 要生成密钥,您需要指定密钥的用途、算法和密钥类型。以下是一个示例,演示了如何生成一个 AES 密钥:
import androidx.security.keymaster.KeyGenParameterSpec; import androidx.security.keymaster.KeyProperties; private void generateKey() throws Exception { KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( "myKeyAlias", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) .setUserAuthenticationRequired(true) .build(); KeymasterManager keymasterManager = (KeymasterManager) getSystemService(Context.KEYMASTER_SERVICE); keymasterManager.keyGen(keyGenParameterSpec, null); }
- 存储密钥:
生成的密钥将存储在设备的安全硬件中。您可以使用 Keymaster 的
extractKey
方法从 Keymaster 模块中提取密钥。为了提取密钥,您需要知道密钥的别名和密钥的派生参数。
import androidx.security.keymaster.KeymasterKey; private KeymasterKey extractKey() throws Exception { KeymasterManager keymasterManager = (KeymasterManager) getSystemService(Context.KEYMASTER_SERVICE); KeyProperties keyProperties = new KeyProperties.Builder() .setAlias("myKeyAlias") .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) .setUserAuthenticationRequired(true) .build(); return keymasterManager.extractKey(null, keyProperties); }
- 使用密钥进行加密和解密: 现在您可以使用提取的密钥对数据进行加密和解密。以下是一个简单的示例,演示了如何使用 Keymaster 对字符串进行加密和解密:
import androidx.security.crypto.EncryptedSharedPreferences; import androidx.security.crypto.MasterKeys; private String encryptData(String data, KeymasterKey keymasterKey) throws Exception { EncryptedSharedPreferences encryptedSharedPreferences = EncryptedSharedPreferences.create( "myEncryptedPreferences", MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC), getApplicationContext(), EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM); SharedPreferences.Editor editor = encryptedSharedPreferences.edit(); editor.putString("myKeyAlias", keymasterKey.getKey()); editor.apply(); return encryptedSharedPreferences.getString("myKeyAlias", null); } private String decryptData(String encryptedData, KeymasterKey keymasterKey) throws Exception { EncryptedSharedPreferences encryptedSharedPreferences = EncryptedSharedPreferences.create( "myEncryptedPreferences", MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC), getApplicationContext(), EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM); String decryptedData = https://www.yisu.com/ask/encryptedSharedPreferences.getString("myKeyAlias", null); if (decryptedData != null) { return decryptedData; } else { byte[] encryptedBytes = encryptedSharedPreferences.getString("myKeyAlias", null).getBytes(); return new String(encryptedBytes); } }
请注意,这个示例仅用于演示目的,实际应用中可能需要根据具体需求进行调整。在使用 Keymaster 时,请确保遵循最佳安全实践,以保护您的应用程序和用户数据的安全。