Android 平台从 Android 7.0(API 级别 24)开始支持 FIDO2 API,并且与 WebAuthn API 兼容。用户可以通过指纹、PIN 或外部安全设备进行身份验证。
如何在 Android 上接入 FIDO2 API
要在 Android 应用中使用 FIDO2 API,你需要遵循以下步骤:
-
添加依赖项
在build.gradle
文件中添加 FIDO2 API 的依赖项:implementation 'androidx.security:security-fido2:1.0.0'
-
使用 FIDO2 API 注册凭证
在 Android 中,你可以使用Fido2Client
来管理注册和验证请求。下面是一个注册流程的代码示例:
Fido2Client fido2Client = Fido.getFido2Client(context); // Create a request for a new credential PublicKeyCredentialCreationOptions options = new PublicKeyCredentialCreationOptions.Builder() .setRp(new PublicKeyCredentialRpEntity("example.com", "Example", null)) .setUser(new PublicKeyCredentialUserEntity( userId.getBytes(), "user@example.com", "User", null)) .setChallenge(challenge) .setParameters(Arrays.asList( new PublicKeyCredentialParameters( PublicKeyCredentialType.PUBLIC_KEY.toString(), COSEAlgorithmIdentifier.ES256))) .build(); // Launch the FIDO2 dialog to start the registration Intent intent = fido2Client.getRegisterIntent(options); startActivityForResult(intent, REQUEST_CODE_REGISTER);
-
处理注册响应 在
onActivityResult
中处理用户完成注册后的返回结果:@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_REGISTER) { if (resultCode == RESULT_OK) { // Get the response from FIDO2 API AuthenticatorAttestationResponse response = AuthenticatorAttestationResponse.deserializeFromBytes( data.getByteArrayExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA)); // Send the response to the server for verification sendAttestationToServer(response); } } }
-
验证凭证
类似地,用户登录时需要使用PublicKeyCredentialRequestOptions
来请求凭证验证:PublicKeyCredentialRequestOptions requestOptions = new PublicKeyCredentialRequestOptions.Builder() .setChallenge(challenge) .setRpId("example.com") .build(); // Start the authentication process Intent intent = fido2Client.getSignIntent(requestOptions); startActivityForResult(intent, REQUEST_CODE_SIGN);
Google Play 动态交付的流程
动态交付(Dynamic Delivery)是 Google Play 提供的一种机制,允许应用按需下载并安装部分功能模块,节省存储空间并加快应用的初始安装速度。
-
配置动态特性模块
在 Android Studio 的dynamic-feature
模块中定义各个功能模块。 -
安装特性模块
应用运行时根据用户的需求动态下载和加载模块:SplitInstallManager manager = SplitInstallManagerFactory.create(context); SplitInstallRequest request = SplitInstallRequest.newBuilder() .addModule("my_dynamic_feature") .build(); manager.startInstall(request) .addOnSuccessListener(sessionId -> { // Module installation successful }) .addOnFailureListener(exception -> { // Handle installation failure });
通过这些步骤,你可以在 Android 上成功实现 FIDO2 API 的集成,并利用动态交付机制优化应用性能。
Android FIDO2 API 即将更新其证明格式,从基于 SafetyNet API 的证明方案转移到基于硬件支持的密钥证明方案,要求开发者采取行动进行平稳过渡。
2019 年,Android 推出了 FIDO2 API,允许在 Android 设备上生成一个带有证明的设备绑定的 FIDO2 凭证。随着 SafetyNet API 的淘汰,FIDO2 API 需要过渡到基于硬件支持的密钥证明的新方案。从 2024 年 11 月开始,Android 将更新 FIDO2 API 以生成基于硬件的密钥证明。开发者可以选择性地采用这种新的证明方案,并在 2025 年 4 月初之前有控制权来测试和逐步部署,以便在接下来的 6 个月里管理过渡。到 2025 年 4 月初,硬件支持的密钥证明将成为默认方式,同时不再提供 SafetyNet 证书。为了确保应用程序能够正确解析新的证明语句,开发者需要在切换日期之前实现对新证明语句的支持或切换到 passkey API。对于 Web 应用程序,需要使用 Chrome 130 或更高版本,并参与 WebAuthn attestationFormats 原始试验。对于使用 FIDO2 Play Services API 的 Android 应用程序,需要 Play Services 版本 22.0.0 或更高版本,并更新相关依赖项以指定 android-key 作为证明格式。Android 开发者博客是该信息的来源。
观点
- Android FIDO2 API 将不再基于 SafetyNet API 进行证明,而是采用硬件支持的密钥证明方案。
- 开发者可以在 2024 年 11 月至 2025 年 4 月初期间选择性地采用新的证明方案,并有机会进行测试和逐步部署。
- 到 2025 年 4 月初,硬件支持的密钥证明将成为 FIDO2 API 的默认行为。
- 开发者需要采取行动,要么支持新的证明语句,要么迁移到 passkey API,以确保应用程序的兼容性。
- Web 应用程序需要使用 Chrome 130 或更高版本,并参与 WebAuthn attestationFormats 原始试验,以请求硬件支持的密钥证明。
- Android 应用程序需要 Play Services 版本 22.0.0 或更高版本,并更新相关依赖项以指定 android-key 作为证明格式。