高端企业门户网站建设服务公司,做视频网站要注意什么,西安网站设计师,农村网站建设的意义架构
Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元#xff0c;以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库#xff0c;密钥库服务使用它来提供由硬件支持的加密服…架构
Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库密钥库服务使用它来提供由硬件支持的加密服务。为了确保安全性HAL 实现不会在用户空间乃至内核空间中执行任何敏感操作。敏感操作会被分配给通过某个内核接口连接的安全处理器。 最终的架构如下所示
源码分析 源码分析基于Android 9.0 ####AndroidKeyStore服务提供者 应用层调用时provider必须指明为AndroidKeyStore否则默使用的是BC库。
Android KeyStore 是Java 安全框架的一个提供者的实现类名为AndroidKeyStoreProvider.java。
此类中定义了一些引擎类的实现:
AndroidKeyStoreSpi 存储服务AndroidKeyStoreKeyPairGeneratorSpi$EC ECC密钥对生成AndroidKeyStoreKeyPairGeneratorSpi$RSA RSA密钥对生成
等等这部分的代码在
/frameworks/base/keystore/java/android/security/keystore/
这些引擎类的实现内部有一个android.security.KeyStore对象。此对象是一个binder代理。通过binder通信转到系统服务的KeyStoreSerivce。
KeyStoreService服务
服务代码在/system/security/keystore/key_store_service.cpp
KeyStoreService 内部持有一个KeyStore对象
代码在/system/security/keystore/KeyStore.cpp
KeyStore对象内部持有一个device,此device是KeymasterDevices此对象是三个Keymaster的数组分别对应软实现、TEE实现和SE实现。如果是TEE实现的话keymaster hal 应该就是CA程序。
当系统启动时会加载keymaster hal的实现并把他注册到硬件的servicemanager 中。
keymaster hal
keymaster hal的注册这里是安卓模拟器goldfish中的服务注册示例。
Cross Reference: /device/generic/goldfish/keymaster/strongbox/service.cpp int main() {::android::hardware::configureRpcThreadpool(1, true /* willJoinThreadpool */);using android::hardware::keymaster::V4_0::SecurityLevel;using ::keymaster::V4_0::ng::CreateKeymasterDevice;/** Create two software keymaster devices claiming different security levels for testing* purposes. They do not have the certificates of real TEE or Strongbox keymaster devices.*/auto keymaster CreateKeymasterDevice(SecurityLevel::TRUSTED_ENVIRONMENT);auto status keymaster-registerAsService(default);if (status ! android::OK) {LOG(FATAL) Could not register default service for Keymaster 4.0 ( status );}auto strongbox CreateKeymasterDevice(SecurityLevel::STRONGBOX);status strongbox-registerAsService(strongbox);if (status ! android::OK) {LOG(FATAL) Could not register strongbox service for Keymaster 4.0 ( status );}android::hardware::joinRpcThreadpool();return -1; // Should never get here.
}keymaster枚举
Cross Reference: /system/security/keystore/keystore_main.cpp
KeymasterDevices enumerateKeymasterDevices(IServiceManager* serviceManager) {KeymasterDevices result;serviceManager-listByInterface(Wrapper::WrappedIKeymasterDevice::descriptor, [](const hidl_vechidl_string names) {})
}通过枚举获取keymaster的实现。构造keystore对象。
keymaster hal实现最终通过调用安全环境实现密钥生成、加密解密、签名验签。
keymaster 实现的接口定义如下。厂商只要按照规范要求实现此接口即可。
Cross Reference: /hardware/interfaces/keymaster/3.0/IKeymasterDevice.hal
Cross Reference: /hardware/interfaces/keymaster/4.0/IKeymasterDevice.hal
Android Keystore 机制总结
Android Keystore 提供安全的密钥管理和加密操作其核心机制涉及多进程协作和跨空间调用。以下是关键组件及其交互流程 重要类与组件
类/组件所在进程运行空间描述android.security.KeyStore应用进程如App进程用户空间应用层API提供密钥生成、存储等接口。开发者通过此类访问Keystore功能。KeyStoreServicekeystore进程用户空间系统服务处理应用请求管理密钥生命周期通过Binder与客户端通信。KeymasterHAL (HIDL接口)厂商HAL进程如vendor.some.process用户空间硬件抽象层接口由厂商实现执行加密操作如密钥生成、签名。内核驱动如/dev/keymaster内核内核空间与硬件安全模块HSM/TEE/StrongBox通信处理安全环境内的敏感操作。 调用流程与通信机制
应用层调用 进程: 应用进程 → keystore 机制: Binder IPC 应用通过 android.security.KeyStore 发起请求如生成密钥。调用通过 Binder 传递至 KeyStoreService运行在 keystore。 系统服务处理 进程: keystore → 厂商HAL进程机制: HIDL/AIDL IPC KeyStoreService 将请求转换为 Keymaster 操作如调用 generateKey。通过 HIDL 接口如 IKeymasterDevice与厂商的 KeymasterHAL 实现通信。 硬件抽象层执行 进程: 厂商HAL进程 → 内核机制: 系统调用ioctl KeymasterHAL 通过 ioctl 调用内核驱动如 /dev/keymaster。驱动将操作转发至安全环境如 TEE 或 StrongBox。 安全环境操作 空间: 内核 → TEE/HSM机制: SMC指令或安全监控调用 内核驱动通过安全机制如 ARM TrustZone 的 SMC触发安全环境内的操作。密钥在安全环境内生成/使用不会暴露到非安全内存。 关键点总结
用户空间与内核空间协作敏感操作如密钥生成最终由安全环境TEE/HSM处理确保密钥不泄露至普通内存。跨进程通信 Binder用于应用与系统服务的高效通信。HIDL/AIDL解耦系统服务与厂商实现支持向前兼容。 安全边界内核驱动作为用户空间与安全环境的桥梁通过严格权限控制保障隔离性。
[应用进程] --Binder-- [keystore进程] --HIDL-- [KeymasterHAL进程] --ioctl-- [内核驱动] -- [TEE/HSM]↑ | || (android.security.KeyStore) | (KeyStoreService) | (厂商实现)用户空间 用户空间 用户空间 内核空间应用代码示例 try {final String KEY_ALIAS myKeyAliasx;KeyStore keyStore;keyStore KeyStore.getInstance(AndroidKeyStore);keyStore.load(null);// 检查密钥是否已存在如果不存在则生成新的密钥对if (!keyStore.containsAlias(KEY_ALIAS)) {//生成密钥KeyGenParameterSpec spec new KeyGenParameterSpec.Builder(KEY_ALIAS,KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY).setDigests(KeyProperties.DIGEST_SHA256).setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS).setKeySize(2048).build();KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, AndroidKeyStore);keyPairGenerator.initialize(spec);KeyPair keyPair keyPairGenerator.generateKeyPair();}KeyStore.PrivateKeyEntry privateKeyEntry (KeyStore.PrivateKeyEntry) keyStore.getEntry(KEY_ALIAS, null);PrivateKey privateKey privateKeyEntry.getPrivateKey();KeyFactory factory KeyFactory.getInstance(privateKey.getAlgorithm(), AndroidKeyStore);KeyInfo keyInfo;//获取密钥信息keyInfo factory.getKeySpec(privateKey, KeyInfo.class);if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) {int securityLevel keyInfo.getSecurityLevel();if (securityLevel KeyProperties.SECURITY_LEVEL_TRUSTED_ENVIRONMENT) {System.out.println(key is in trusted environment);} else if (securityLevel KeyProperties.SECURITY_LEVEL_STRONGBOX) {System.out.println(key is in strongbox);} else {System.out.println(key is in software);}} else {boolean insideSecureHardware keyInfo.isInsideSecureHardware();System.out.println(insideSecureHardware insideSecureHardware);}// 签名Signature signature Signature.getInstance(SHA256withRSA/PSS);signature.initSign(privateKey);signature.update(adgfdfd.getBytes(UTF-8));byte[] sign signature.sign();} catch (Exception e) {e.printStackTrace();}