我知道该线程很旧,但也许它会对将来的某人有所帮助。以下提示参考 Android Keystore v3 和 v4(分别为 Oreo 和 Pie)。
基本上是 HAL 密钥库(如所述here https://android.googlesource.com/platform/hardware/interfaces/+/master/keymaster/3.0/IKeymasterDevice.hal) 包含在密钥库服务中。
服务 API 模仿 IKeymasterDevice.hal 中描述的接口。您可以使用密钥的字符串别名(例如“mySecretKey”)来代替 blob。
该服务将密钥块(原始密钥材料+密钥参数)存储到文件系统。默认位置为 /data/misc/keystore/user_0/_。
密钥库服务也是检查是否允许请求进程使用密钥的层(基于进程 uid)。
与密钥库服务的通信是通过绑定器接口(IPC)完成的。您可能想了解更多相关信息here https://developer.android.com/reference/android/os/Binder.
AOSP 包含参考客户端实现here http://androidxref.com/9.0.0_r3/xref/system/security/keystore/keystore_client_impl.cpp.
示例用法可以在库存 CLI 中找到here http://androidxref.com/9.0.0_r3/xref/system/security/keystore/keystore_cli_v2.cpp
AOSP 附带了基于软件的密钥库实现,可以找到here http://androidxref.com/9.0.0_r3/xref/system/keymaster/。默认情况下,AOSP 版本上的 keyblob 未加密。
请注意,库存 keystore_cli_v2 不提供密钥导入支持。如果您计划离线加密数据(例如 pycrypto),则必须对其进行扩展。如果您打算这样做,请记住 keystore_client_impl.cpp 链接到 libkeystore_binder.so 而不是 keystore_cli_v2。
对于非对称密钥密码,您可以使用 API 导出公钥组件。