HarmonyOS IFAA 免密认证:另一种指纹人脸登录方案,也许适合你的app

HarmonyOS IFAA 免密认证:另一种指纹人脸登录方案,也许适合你的app 什么是 IFAA 免密认证上一篇我们讲了 FIDO 免密认证这篇来讲另一种方案——IFAA。IFAA 的全称是互联网金融身份认证联盟Internet Finance Authentication Alliance听名字就知道它主要是为金融场景设计的。蚂蚁集团、华为、三星、阿里巴巴这些都是 IFAA 的发起成员。IFAA 和 FIDO 的目标一样都是让你用指纹或人脸来代替密码。但 IFAA 更侧重于金融支付场景比如免密支付、免密登录等。简单说IFAA 就是另一套用生物特征代替密码的标准特别适合需要高安全性的金融场景。核心功能HarmonyOS 的 IFAA 免密认证提供以下功能开通 IFAA 认证注册生物特征绑定到你的账号。开通过程需要从 IIFAA 中心服务器获取开通报文然后调用ifaa.register完成注册。注册成功后你的生物特征就安全地存储在设备的安全区域里了使用 IFAA 认证用指纹或人脸进行认证。认证过程分两步先获取一个 challenge防止重放攻击然后拉起生物特征认证界面。用户认证通过后把认证结果发给服务器验证。整个过程就像先拿一张入场券然后验票进场关闭 IFAA 认证解除生物特征和账号的绑定。关闭需要从 IIFAA 中心服务器获取关闭报文然后调用ifaa.deregister完成注销。注销后你的生物特征就不再和账号关联了环境搭建硬件要求设备类型华为手机、平板、2in1HarmonyOS 系统HarmonyOS NEXT Developer Beta1 及以上生物特征设备需要支持指纹或 3D 人脸软件要求DevEco Studio 版本DevEco Studio NEXT Developer Beta1 及以上HarmonyOS SDK 版本HarmonyOS NEXT Developer Beta1 SDK 及以上搭建步骤安装 DevEco Studio去华为开发者官网下载安装配置开发环境确保网络环境正常设备调试使用真机进行调试项目结构├── entry/src/main/ets │ ├── entryability │ │ └── EntryAbility.ets // 程序入口类 │ ├── model │ │ └── IfaaModel.ets // 开通、认证、关闭功能实现 │ ├── pages │ │ └── Index.ets // 主页面入口 │ └── util │ └── Util.ets // 工具类和 FIDO 的项目结构类似核心逻辑放在IfaaModel.ets里。IFAA 开通流程下面是 IFAA 免密认证的开通流程是否检查 IFAA 是否已开通是否已开通?直接返回从 IIFAA 服务器获取开通报文调用 ifaa.register生物特征注册到安全区域开通成功IFAA 认证流程下面是 IFAA 免密认证的认证流程是否是否调用 getChallenge 获取挑战值配置认证参数拉起生物特征认证界面用户认证是否通过?获取 authToken认证失败调用 ifaa.auth服务器验证是否通过?认证成功验证失败第一步导入模块import{ifaa}fromkit.OnlineAuthenticationKit;import{userAuth}fromkit.UserAuthenticationKit;这里导入了两个模块ifaaIFAA 免密认证的核心接口userAuth用户认证接口用来拉起指纹/人脸认证界面第二步检查 IFAA 是否已开通在开通之前先检查一下当前设备是否已经开通了 IFAA 认证。publicregister(dataType:string):PromiseUint8Array|null{// 检查IFAA免密认证能力是否已经开通if(sampleData[dataType]null){console.error(invalid parameters!);thrownewError(invalid parameters);}letdatasampleData[dataType];letregisterResifaa.queryStatusSync(this.stringToUint8Array(data[3]));if(registerRestrue){thrownewError(ifaa already registered);}ifaa.queryStatusSync是一个同步方法用来查询 IFAA 是否已经开通。如果返回true说明已经开通了就不需要重复开通了。第三步开通 IFAA 免密认证// 请参考全量代码, 替换IIFAA中心服务器签名下发的数据returnifaa.register(this.hexToBytes(data[0]));}调用ifaa.register来开通 IFAA 认证。传入的参数是 IIFAA 中心服务器下发的开通报文。这里的data[0]是从 IIFAA 中心服务器获取的报文数据需要你替换为实际的服务器数据。第四步使用 IFAA 免密认证IFAA 的认证流程分两步先获取 challenge再进行生物特征认证。// 认证步骤// 使用 ifaa.PreAuth 获取challengeletifaaChallenge:Uint8ArrayIfaaModel.getChallenge();先调用IfaaModel.getChallenge获取一个 challenge。这个 challenge 是用来防止重放攻击的每次认证都会生成一个新的。// 拉起生物特征认证此步骤为IFAA流程所需步骤非IFAA能力letauthParam:userAuth.AuthParam{challenge:ifaaChallenge,authType:[userAuth.UserAuthType.FINGERPRINT],authTrustLevel:userAuth.AuthTrustLevel.ATL4};letuserAuthInstanceuserAuth.getUserAuthInstance(authParam,{title:请认证});然后用userAuth拉起生物特征认证界面。这里配置了challenge前面获取的 challengeauthType认证类型这里用的是指纹authTrustLevel认证信任等级ATL4 是最高等级title认证界面显示的标题userAuthInstance.on(result,{asynconResult(result){letauthTokenresult.token;try{// 生物特征认证成功后调用IFAA认证awaitIfaaModel.auth(ifaaAuthType,authToken);show(IFAA auth success);}catch(err){show(IFAA auth failed);}}});userAuthInstance.start();监听认证结果。用户完成指纹或人脸认证后会返回一个authToken。然后把这个 token 传给IfaaModel.auth完成 IFAA 认证。publicauth(dataType:string,authToken:Uint8Array):PromiseUint8Array|null{if(authTokennull){console.error(invalid parameters!);thrownewError(invalid parameters!);}letdatasampleData[dataType];// 替换IIFAA中心服务器签名下发的数据returnifaa.auth(authToken,this.hexToBytes(data[1]));}ifaa.auth是 IFAA 认证的核心方法。它接收两个参数authToken生物特征认证后返回的 tokendata[1]IIFAA 中心服务器下发的认证报文第五步关闭 IFAA 免密认证如果不想用 IFAA 免密认证了可以关闭它。publicderegister(dataType:string):Promisevoid{if(sampleData[dataType]null){console.error(invalid parameters!);thrownewTypeError(Error message);}letdatasampleData[dataType];// 替换IIFAA中心服务器签名下发的数据returnifaa.deregister(this.hexToBytes(data[2]));}调用ifaa.deregister来关闭 IFAA 认证。传入的参数是 IIFAA 中心服务器下发的关闭报文。IFAA 认证流程整个 IFAA 认证流程是这样的开通流程检查 IFAA 是否已开通从 IIFAA 中心服务器获取开通报文调用ifaa.register开通认证生物特征注册到设备安全区域认证流程调用IfaaModel.getChallenge获取 challenge调用userAuth拉起生物特征认证用户进行指纹或人脸认证获取 authToken调用ifaa.auth完成 IFAA 认证关闭流程从 IIFAA 中心服务器获取关闭报文调用ifaa.deregister关闭认证IFAA 和 FIDO 的区别你可能会问IFAA 和 FIDO 都是免密认证有什么区别特性IFAAFIDO发起方中国信通院、蚂蚁集团等FIDO Alliance国际主要场景金融支付通用认证协议标准IIFAA 协议UAF 协议生态国内金融为主全球通用简单说IFAA 更适合国内金融场景FIDO 更通用。如果你的应用面向国内市场特别是金融类应用IFAA 可能更合适。实际应用场景IFAA 免密认证在实际开发中有很多用途免密支付// 用户支付时用指纹确认asyncfunctionpayWithFingerprint(amount:number){letchallengeIfaaModel.getChallenge();letauthTokenawaitstartBiometricAuth(challenge);letresultawaitIfaaModel.auth(payment,authToken);// 验证结果完成支付}免密登录// 用户打开应用直接用指纹登录asyncfunctionloginWithFingerprint(){letchallengeIfaaModel.getChallenge();letauthTokenawaitstartBiometricAuth(challenge);letresultawaitIfaaModel.auth(login,authToken);// 验证结果完成登录}身份验证// 敏感操作前验证用户身份asyncfunctionverifyIdentity(){letchallengeIfaaModel.getChallenge();letauthTokenawaitstartBiometricAuth(challenge);letresultawaitIfaaModel.auth(verify,authToken);// 验证结果允许操作}适用场景IFAA 免密认证适合以下场景银行应用免密登录、免密支付金融应用身份验证、交易确认支付应用免密支付企业应用员工登录、敏感操作确认注意事项IIFAA 服务器需要接入 IIFAA 中心服务器获取报文数据设备支持设备需要支持指纹或 3D 人脸生物特征录入使用前需要先录入指纹或人脸报文安全IIFAA 中心服务器下发的报文要妥善保管不要泄露challenge 机制每次认证都要生成新的 challenge防止重放攻击总结IFAA 免密认证让你的应用支持指纹和人脸登录特别适合金融场景核心流程检查 IFAA 是否已开通从 IIFAA 中心服务器获取报文调用ifaa.register开通认证调用userAuth拉起生物特征认证调用ifaa.auth完成认证调用ifaa.deregister关闭认证掌握了这些你就能让你的应用支持 IFAA 免密认证提升用户体验和安全性。