一、使用说明
小米通过实现Google标准协议下的通行密钥管理器,让您的应用可以使用 Credential Manager API 来完成安全高效的身份验证(如使用指纹传感器等来完成用户的身份认证),并且“小米通行密钥管理器”可将您应用注册的通行密钥同步到其他小米设备上使用。
二、使用约束
小米设备在中国大陆版本的系统中会使用“小米通行密钥管理器”来管理您应用的通行密钥,在非中国大陆版的系统中会使用“Google通行密钥管理器”(依赖GMS)来管理您的通行密钥(注:两个通行密钥管理器的数据互不相通),但是对于您的应用来说只需要判断当前设备是否支持“通行密钥管理器”即可(具体判断方法请参考三、1.2),如没有特殊需求则无需关心当前设备将使用哪种“通行密钥管理器”来管理您的通行密钥。
三、开发步骤

1、客户端开发步骤
1.1、根据Google官方文档实现通行密钥的注册、认证的功能
详情请参见 Credential Manager API
1.2、如何判断设备是否支持“通行密钥管理器”
/**
* 判断设备是否支持“小米通行密钥管理器“(支持“小米通行密钥管理器“即表示支持通行密钥管理器服务)
*/
private static boolean isSupportXiaomiCredentialManager(Context context) {
if (!isSupportCredentialManagerService(context)) {
return false;
}
try {
ApplicationInfo asmInfo = context.getPackageManager().getApplicationInfo("com.fido.asm", PackageManager.GET_META_DATA);
ApplicationInfo cloudInfo = context.getPackageManager().getApplicationInfo("com.miui.cloudservice", PackageManager.GET_META_DATA);
if (asmInfo == null || cloudInfo == null) {
return false;
}
int passkeyVersion = asmInfo.metaData.getInt("passkeyVersion");
int keyBagTaVersion = cloudInfo.metaData.getInt("support_keybag_ta_version");
return passkeyVersion > 0 && keyBagTaVersion > 0;
} catch (PackageManager.NameNotFoundException|NullPointerException e) {
//
}
return false;
}
/**
* 判断设备是否支持通行密钥管理器服务,但是并不能表示当前设备有可用的通行密钥管理器
*/
public static boolean isSupportCredentialManagerService(Context context) {
return Build.VERSION.SDK_INT >= 34 && context.getSystemService(Context.CREDENTIAL_SERVICE) != null;
}2、FIDO2 Server开发步骤
FIDO2 Server是对应客户端开发中接入 Credential Manager API 中的创建密钥、使用密钥认证时所需JSON报文数据。
2.1、了解FIDO2基本原理
可在官网FIDO联盟了解FIDO2的基本工作原理,以及FIDO2带来的安全性、易用性、跨平台等优势。
2.2、在服务端实现PassKey的注册与验证
(1)服务端的注册与验证
虽然FIDO2功能都可以自行开发实现,但是,服务端的PassKey能力,建议参考或者引入库实现,具体库参考见第四部分(代码参考demo下载)。这主要是基于以下理由:
- FIDO2的复杂性:FIDO2协议包括UAF、U2F、WebAuthn、CTAP等已相当繁琐,要从零开始开发一个安全可用的FIDO2后端服务,需要投入相当大的时间成本和人力成本。而引入库实现可以极大的减少开发FIDO2的投入。
- FIDO2的持续发展:FIDO2的相关规范仍在演进的过程中。使用维护良好的库,可以更好的追上FIDO2发展的脚步,更快的引入FIDO2的新能力。
- FIDO2的安全合规:FIDO2作为一种身份验证机制,涉及密码学的签名验证等机制,对安全性是有较高要求的,以保障用户的信息安全。直接引入经过验证的FIDO2服务器库,可以更好的确保实现了安全性相关规范。
(2)assetlinks验证
为了防范钓鱼等攻击方式,进一步提升FIDO2安全,需要在服务端配置相关JSON 文件,将第三方的应用与第三方的网站关联。具体关联方式,参考谷歌的assetlinks验证。
四、代码参考demo下载
服务端代码可参考 :https://github.com/yackermann/awesome-webauthn?tab=readme-ov-file
该页面下,有社区精选的FIDO2服务端开源框架,可根据需求开发语言、用户规模选取合适的框架。如:
(1)如果是快速部署,体验FIDO2的应用效果,建议使用 LINE:FIDO2 服务器- 由 FIDO 联盟和依赖方示例正式认证的 FIDO2(WebAuthn)服务器。该开源项目有完整的前端、后端配套代码,可快速在本地部署体验FIDO2的运行效果。
(2)如果考虑线上部署,可对line-fido2-server的数据库层等完成定制化开发,即可使用。或者参考下述开源框架,更灵活的结合公司自身的其它基础架构实现FIDO2的能力。
- WebAuthn4J 项目:WebAuthn4J - 用于 WebAuthn 服务器端验证的可移植 Java 库。
FIDO2 CONFORMANTWebAuthn Go 库- 用 Go 编写的 WebAuthn 库(取代已存档和弃用的DUO:WebAuthn Go 库)。