android 6.0+有一个KeyInfo类来获取保存在AndroidKeyStore中的密钥的信息。在KeyInfo类中,我们有isInsideSecureHardware()isUserAuthenticationRequirementEnforcedBySecureHardware()方法。我们还有isUserAuthenticationRequired()。像往常一样,documentation很烂。
基于方法名和(有限的)文档,似乎isUserAuthenticationRequirementEnforcedBySecureHardware()只是一个
isInsideSecureHardware()isUserAuthenticationRequired()
还有什么比这更重要的吗?如果是,除了密钥在安全硬件中之外,安全硬件强制执行用户身份验证要求意味着什么?

最佳答案

isUserAuthenticationRequirementEnforcedBySecureHardware()方法不是一个逻辑的和isInsideSecureHardware()isUserAuthenticationRequired()的方法。
但如果你深入研究code,你会发现这是一个逻辑和3件事:
IsUserAuthenticationRequired()
0个软件强制用户身份验证程序
一个或多个硬件强制用户身份验证程序
代码片段:

boolean userAuthenticationRequirementEnforcedBySecureHardware = (userAuthenticationRequired)
                && (keymasterHwEnforcedUserAuthenticators != 0)
                && (keymasterSwEnforcedUserAuthenticators == 0);

区别不在于密钥在硬件上是否安全,而在于用户身份验证是否有硬件支持,而不是软件支持。对于大多数情况,如果不是所有设备都有指纹读取器,则安全硬件中的用户身份验证意味着tee将包含两个与keymaster可信应用程序交互的内容:
Gatekeeper用于PIN/密码/模式的受信任应用程序
Fingerprint用于指纹身份验证的受信任应用程序
示例场景:
isUserAuthenticationRequirementEnforcedBySecureHardware()如果isInsideSecureHardware()isUserAuthenticationRequired()都返回true,则可能返回false,但用户身份验证是在sw中完成的,而不是在tee中完成的。(不太可能)
isUserAuthenticationRequirementEnforcedBySecureHardware()如果返回false(设备的安全硬件不支持密钥),则可以返回true;如果在硬件中完成用户身份验证,则返回true。(可能)

07-27 20:51