目录
1.AndroidKeyStoreKeyPairGeneratorSpi
2.AndroidKeyStoreECDSASignatureSpi
前面,我们从类结构视角看了下KeyStore2的整体类结构派生关系和设计。这里,我们逐个看下每个KeyStore2的类分别提供了什么能力。主要分为2个部分
一、Key类簇
我们前面在KeyStore2的部分整体看了Key类簇的整体框架设计如下:

这里,我们进一步深入看下这些类:
1.最顶层的父类AndroidKeyStoreKey
这里主要保存了秘钥描述信息、KeyId(秘钥id)、mAuthorizations(秘钥的访问控制策略)mAlgorithm、mSecurityLevel这些信息。这些是无论公钥还是私钥,无论那种算法都会涉及的信息,所以放在基类中:

2.派生的公私钥类
进一步,除了秘钥本身的存储和表示之外,对于不同的秘钥类型,比如公钥,还需要确保公钥来源的可信,比如验证公钥是否由
可信的CA签发。因此除了mCoded来存储编码后的公钥外,还在公钥类中设计了mCertificate和mCertificateChain来存储公钥相关的证书和证书链。是1的子类

3.具体的算法相关的秘钥类(如RSA、EC等)
因为不同的加密算法会使用不同的数学原理和数据结构来表示密钥(比如RSA这类非对称算法通常会用模数n和私钥指数d来表示私钥,由模数n和公钥指数e来表示公钥。而EC由椭圆曲线参数和私钥值d来表示私钥,由椭圆曲线参数和公钥点(x,y)来表示公钥)。是2的子类
RSA:

EC:

总结:因此,不同的算法秘钥类,有其不同的成员变量和秘钥类接口实现。(接口同理)
通过这样一个类簇,就能完成对相应秘钥的管理和操作。并且具备良好的扩展性。
二、Spi类簇
前面在KeyStore2部分也整体看了Spi框架这部分的类框架设计。这里看下几个比较核心的:
1.AndroidKeyStoreKeyPairGeneratorSpi
我们可以看到这个类簇
(1)定义了一些直接以算法命名的静态内部类,如RSA、EC、XDH、ED25519.
(2)还定义了一个MAP数组,存储了算法名称和秘钥长度的对应关系。
(3)有一个KeyStore2的成员变量。
其核心功能就是在抽象父类中定义的 generateKeyPair函数。此外还有一些检查秘钥目的的函数。
2.AndroidKeyStoreECDSASignatureSpi
这个类主要是使用Android KeyStore生成ECDSA数字签名。(先基于不同哈希算法计算出一个哈希值,然后使用私钥对哈希值进行签名)。这里也定义了很多哈希算法名称命名的静态内部类。
会调用从父类继承的Signature类型对象mSignature来完成签名动作。
3.AndroidKeyStoreSpi
主要是KeyStore秘钥设置、获取和校验以及和keystore启动加载的功能(根据密码判断是否加载)。
4.加密相关的Spi类【重点】
这部分整体的框架如下:

ps:注意的这里有一个AndroidKeyStoreUnauthenticatedAESCipherSpi和AndroidKeyStoreAuthenticatedAESCipherSpi。
(1)一个是普通 AES(Unauthenticated) 只适合某些本地加密场景,例如数据库加密。适用于 AES/CBC/PKCS7Padding 和 AES/ECB/PKCS7Padding 等传统 AES 模式。由于没有额外的身份验证标签,攻击者可以篡改密文,而不会被检测到。特别是在 AES-CBC 模式 下,容易遭受 Padding Oracle 攻击。早期的加密方案(如 AES-CBC)广泛使用,不支持身份验证,因此 Android 需要保留UnauthenticatedAESCipherSpi以兼容旧系统。
(2)Authenticated AES 需要额外的计算资源来生成和验证身份验证标签,因此比普通 AES 稍微慢一些。如果应用场景不需要数据完整性保护,使用 普通 AES 可以减少计算开销。现代应用越来越多地采用 AES-GCM/AES-CCM,所以 Android 也提供AuthenticatedAESCipherSpi来增强安全性。
下一步,我们将整理和看下更底层一点的keymaster部分的框架。【技术灌水可进q:1033627716】
1万+


-安全架构-KeyStore2-Key类簇和Spi类簇&spm=1001.2101.3001.11974&articleId=146209342&d=1&t=3&u=810f47d4b4fa499cbe33f8f68dbdc60b)

被折叠的 条评论
为什么被折叠?



