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完成注销。注销后,你的生物特征就不再和账号关联了
环境搭建
硬件要求
- 设备类型:华为手机、平板、2in1
- HarmonyOS 系统: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 认证流程
下面是 IFAA 免密认证的认证流程:
第一步:导入模块
import{ifaa}from'@kit.OnlineAuthenticationKit';import{userAuth}from'@kit.UserAuthenticationKit';这里导入了两个模块:
ifaa:IFAA 免密认证的核心接口userAuth:用户认证接口,用来拉起指纹/人脸认证界面
第二步:检查 IFAA 是否已开通
在开通之前,先检查一下当前设备是否已经开通了 IFAA 认证。
publicregister(dataType:string):Promise<Uint8Array|null>{// 检查IFAA免密认证能力是否已经开通if(sampleData[dataType]===null){console.error("invalid parameters!");thrownewError("invalid parameters");}letdata=sampleData[dataType];letregisterRes=ifaa.queryStatusSync(this.stringToUint8Array(data[3]));if(registerRes===true){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:Uint8Array=IfaaModel.getChallenge();先调用IfaaModel.getChallenge获取一个 challenge。这个 challenge 是用来防止重放攻击的,每次认证都会生成一个新的。
// 拉起生物特征认证(此步骤为IFAA流程所需步骤,非IFAA能力)letauthParam:userAuth.AuthParam={challenge:ifaaChallenge,authType:[userAuth.UserAuthType.FINGERPRINT],authTrustLevel:userAuth.AuthTrustLevel.ATL4};letuserAuthInstance=userAuth.getUserAuthInstance(authParam,{title:'请认证'});然后用userAuth拉起生物特征认证界面。这里配置了:
challenge:前面获取的 challengeauthType:认证类型,这里用的是指纹authTrustLevel:认证信任等级,ATL4 是最高等级title:认证界面显示的标题
userAuthInstance.on('result',{asynconResult(result){letauthToken=result.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):Promise<Uint8Array|null>{if(authToken===null){console.error("invalid parameters!");thrownewError("invalid parameters!");}letdata=sampleData[dataType];// 替换IIFAA中心服务器签名下发的数据returnifaa.auth(authToken,this.hexToBytes(data[1]));}ifaa.auth是 IFAA 认证的核心方法。它接收两个参数:
authToken:生物特征认证后返回的 tokendata[1]:IIFAA 中心服务器下发的认证报文
第五步:关闭 IFAA 免密认证
如果不想用 IFAA 免密认证了,可以关闭它。
publicderegister(dataType:string):Promise<void>{if(sampleData[dataType]===null){console.error("invalid parameters!");thrownewTypeError("Error message");}letdata=sampleData[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 都是免密认证,有什么区别?
| 特性 | IFAA | FIDO |
|---|---|---|
| 发起方 | 中国信通院、蚂蚁集团等 | FIDO Alliance(国际) |
| 主要场景 | 金融支付 | 通用认证 |
| 协议标准 | IIFAA 协议 | UAF 协议 |
| 生态 | 国内金融为主 | 全球通用 |
简单说,IFAA 更适合国内金融场景,FIDO 更通用。如果你的应用面向国内市场,特别是金融类应用,IFAA 可能更合适。
实际应用场景
IFAA 免密认证在实际开发中有很多用途:
免密支付
// 用户支付时,用指纹确认asyncfunctionpayWithFingerprint(amount:number){letchallenge=IfaaModel.getChallenge();letauthToken=awaitstartBiometricAuth(challenge);letresult=awaitIfaaModel.auth('payment',authToken);// 验证结果,完成支付}免密登录
// 用户打开应用,直接用指纹登录asyncfunctionloginWithFingerprint(){letchallenge=IfaaModel.getChallenge();letauthToken=awaitstartBiometricAuth(challenge);letresult=awaitIfaaModel.auth('login',authToken);// 验证结果,完成登录}身份验证
// 敏感操作前,验证用户身份asyncfunctionverifyIdentity(){letchallenge=IfaaModel.getChallenge();letauthToken=awaitstartBiometricAuth(challenge);letresult=awaitIfaaModel.auth('verify',authToken);// 验证结果,允许操作}适用场景
IFAA 免密认证适合以下场景:
- 银行应用:免密登录、免密支付
- 金融应用:身份验证、交易确认
- 支付应用:免密支付
- 企业应用:员工登录、敏感操作确认
注意事项
- IIFAA 服务器:需要接入 IIFAA 中心服务器,获取报文数据
- 设备支持:设备需要支持指纹或 3D 人脸
- 生物特征录入:使用前需要先录入指纹或人脸
- 报文安全:IIFAA 中心服务器下发的报文要妥善保管,不要泄露
- challenge 机制:每次认证都要生成新的 challenge,防止重放攻击
总结
IFAA 免密认证让你的应用支持指纹和人脸登录,特别适合金融场景,核心流程:
- 检查 IFAA 是否已开通
- 从 IIFAA 中心服务器获取报文
- 调用
ifaa.register开通认证 - 调用
userAuth拉起生物特征认证 - 调用
ifaa.auth完成认证 - 调用
ifaa.deregister关闭认证
掌握了这些,你就能让你的应用支持 IFAA 免密认证,提升用户体验和安全性。
