# HarmonyOS SOTER 免密认证:让你的APP也可以跟微信指纹支付一样
什么是 SOTER 免密认证前面两篇我们讲了 FIDO 和 IFAA这篇来讲第三种方案——SOTER。如果你用微信指纹支付过那你其实已经用过 SOTER 了。SOTER 是一套生物认证平台和标准主要用在微信小程序、公众号、指纹支付等场景。它的目标和 FIDO、IFAA 一样都是让你用指纹或人脸来代替密码但 SOTER 更侧重于微信生态。简单说SOTER 就是微信指纹支付背后的认证标准。如果你想让你的应用支持类似微信指纹支付的功能SOTER 就是你需要的。核心功能HarmonyOS 的 SOTER 免密认证提供以下功能生成应用密钥ASK为你的应用生成一对密钥。ASK 是 Application Secure Key 的缩写每个应用只需要生成一次。这个密钥用来标识你的应用就像你的身份证一样。如果已经生成过了就直接获取不会重复生成生成认证密钥AK为用户的生物特征生成认证密钥。AK 是 Auth Key 的缩写每个用户的生物特征会对应一个认证密钥。你可以用keyAlias来区分不同的用户或场景比如支付和登录可以用不同的 keyAlias签名认证数据用认证密钥对数据进行签名。这是 SOTER 的核心功能。用户完成指纹或人脸认证后系统会返回一个 authToken你把 authToken 和要签名的数据一起传给signWithAuthKeySync就能得到一个数字签名。服务器用公钥验证这个签名就能确认用户的身份删除认证密钥解除绑定。删除后用户的生物特征就不再和应用关联了。如果想再次使用需要重新生成认证密钥环境搭建硬件要求设备类型华为手机、平板、PC/2in1HarmonyOS 系统HarmonyOS NEXT Beta1 及以上生物特征设备需要支持指纹或 3D 人脸软件要求DevEco Studio 版本DevEco Studio NEXT Beta1 及以上HarmonyOS SDK 版本HarmonyOS NEXT Beta1 SDK 及以上搭建步骤安装 DevEco Studio去华为开发者官网下载安装配置开发环境确保网络环境正常设备调试使用真机进行调试项目结构├── entry/src/main/ets │ ├── entryability │ │ └── EntryAbility.ets // 程序入口类 │ ├── model │ │ └── SoterModel.ets // 生成密钥、签名、删除密钥功能 │ └── pages │ └── Index.ets // 主页面入口 └── entry/src/main/resources // 应用资源目录核心逻辑放在SoterModel.ets里包括密钥管理和签名认证。SOTER 开通流程下面是 SOTER 免密认证的开通流程否是否是检查 ASK 是否已生成ASK 是否存在?生成应用密钥 ASK获取已有 ASK检查 AK 是否已生成AK 是否存在?生成认证密钥 AK获取已有 AK开通完成SOTER 认证流程下面是 SOTER 免密认证的认证流程是否是否获取挑战值 challenge配置认证参数拉起生物特征认证用户认证是否通过?获取 authToken认证失败调用 signWithAuthKeySync生成数字签名发送签名给服务器服务器用公钥验证签名验证是否通过?认证成功验证失败第一步导入模块import{soter}fromkit.OnlineAuthenticationKit;import{userAuth}fromkit.UserAuthenticationKit;导入两个模块soterSOTER 免密认证的核心接口userAuth用户认证接口用来拉起指纹/人脸认证界面第二步生成应用密钥ASKASK 是 Application Secure Key 的缩写就是应用密钥。每个应用需要先生成自己的密钥对。publicgenerateAppSecureKey(keyType:soter.KeyType):PromiseUint8Array{// 检查ASK是否已生成if(soter.hasAppSecureKeySync(keyType)){returnsoter.getAppSecureKey(keyType);}else{returnsoter.generateAppSecureKey(keyType);}}先用soter.hasAppSecureKeySync检查应用密钥是否已经生成。如果已经生成了就直接获取如果没有就调用soter.generateAppSecureKey生成一个新的。这个密钥是用来标识你的应用的每个应用只需要生成一次。第三步生成认证密钥AKAK 是 Auth Key 的缩写就是认证密钥。每个用户的生物特征会对应一个认证密钥。publicgenerateAuthKey(keyType:soter.KeyType,keyAlias:string):Promisesoter.SignedResult{// 检查AK是否已生成if(soter.hasAuthKeySync(keyAlias,keyType)){returnsoter.getAuthKey(keyAlias,keyType);}else{returnsoter.generateAuthKey(keyAlias,keyType);}}和 ASK 类似先检查认证密钥是否已经生成。keyAlias是密钥的别名可以用来区分不同的用户或场景。第四步获取认证挑战值每次认证前需要先获取一个挑战值challenge用来防止重放攻击。publicgetChallenge(keyAlias:string):Uint8Array{returnsoter.generateChallengeSync(keyAlias);}调用soter.generateChallengeSync获取挑战值。这个值是同步返回的每次认证都会生成一个新的。第五步进行生物特征认证有了挑战值就可以拉起生物特征认证了。letsoterChallenge:Uint8ArraySoterModel.getChallenge(keyAlias);// 拉起生物特征认证此步骤为SOTER流程所需步骤非SOTER能力letauthParam:userAuth.AuthParam{challenge:soterChallenge,authType:[userAuth.UserAuthType.FINGERPRINT],authTrustLevel:userAuth.AuthTrustLevel.ATL4};letuserAuthInstanceuserAuth.getUserAuthInstance(authParam,{title:请认证});配置认证参数challenge前面获取的挑战值authType认证类型这里用的是指纹authTrustLevel认证信任等级ATL4 是最高等级title认证界面显示的标题userAuthInstance.on(result,{asynconResult(result:userAuth.UserAuthResult){letauthTokenresult.token;if(result.result!12500000){show(SOTER auth failed);}else{try{// 生物特征认证成功后调用SOTER认证SoterModel.auth(keyAlias,authToken,info);show(SOTER auth success);}catch(err){show(SOTER auth failed);}}}});userAuthInstance.start();监听认证结果。result.result等于12500000表示认证成功。认证成功后获取authToken然后调用 SOTER 的签名方法。第六步签名认证数据SOTER 的核心是用认证密钥对数据进行签名。publicauth(keyAlias:string,authToken:Uint8Array,info:string):soter.SignedResult{if(authTokennull){console.error(invalid parameters!);thrownewError(invalid parameters!);}returnsoter.signWithAuthKeySync(keyAlias,authToken,info);}调用soter.signWithAuthKeySync对数据进行签名。这个方法接收三个参数keyAlias认证密钥的别名authToken生物特征认证后返回的 tokeninfo要签名的数据签名结果会返回给服务器服务器用公钥验证签名确认用户的身份。第七步删除认证密钥如果不想用 SOTER 免密认证了可以删除认证密钥。publicdeleteAuthKey(keyAlias:string):Promisevoid{returnsoter.deleteAuthKey(keyAlias);}调用soter.deleteAuthKey删除认证密钥。删除后用户的生物特征和应用的绑定关系就解除了。SOTER 认证流程整个 SOTER 认证流程是这样的开通流程生成应用密钥ASK生成认证密钥AK获取挑战值challenge拉起生物特征认证用认证密钥签名数据把签名结果发送给服务器认证流程获取挑战值challenge拉起生物特征认证用认证密钥签名数据把签名结果发送给服务器服务器验证签名关闭流程删除认证密钥AKSOTER、IFAA、FIDO 的区别三种免密认证方案各有特点特性SOTERIFAAFIDO发起方腾讯中国信通院FIDO Alliance主要场景微信生态金融支付通用认证密钥管理ASK AK服务器下发UAF 协议生态微信小程序/支付国内金融全球通用简单说如果你的应用在微信生态里用 SOTER如果你的应用是金融类的用 IFAA如果你的应用面向全球用 FIDO实际应用场景SOTER 免密认证在实际开发中有很多用途微信小程序指纹支付// 用户在小程序里用指纹支付asyncfunctionpayWithFingerprint(orderId:string){letchallengeSoterModel.getChallenge(payment);letauthTokenawaitstartBiometricAuth(challenge);letsignatureSoterModel.auth(payment,authToken,orderId);// 把签名发送给服务器验证}免密登录// 用户用指纹登录asyncfunctionloginWithFingerprint(){letchallengeSoterModel.getChallenge(login);letauthTokenawaitstartBiometricAuth(challenge);letsignatureSoterModel.auth(login,authToken,login_data);// 把签名发送给服务器验证}身份验证// 敏感操作前验证身份asyncfunctionverifyIdentity(){letchallengeSoterModel.getChallenge(verify);letauthTokenawaitstartBiometricAuth(challenge);letsignatureSoterModel.auth(verify,authToken,verify_data);// 把签名发送给服务器验证}适用场景SOTER 免密认证适合以下场景微信小程序小程序内的指纹支付微信公众号公众号内的身份验证支付应用指纹支付、人脸支付金融应用身份验证、交易确认注意事项网络要求使用 SOTER 时需要处于联网状态设备支持设备需要支持指纹或 3D 人脸生物特征录入使用前需要先录入指纹或人脸密钥安全ASK 和 AK 要妥善保管挑战值机制每次认证都要生成新的挑战值防止重放攻击总结SOTER 免密认证让你的应用支持类似微信指纹支付的功能核心流程生成应用密钥ASK生成认证密钥AK获取挑战值拉起生物特征认证用认证密钥签名数据把签名结果发送给服务器验证掌握了这些你就能让你的应用支持 SOTER 免密认证提升用户体验和安全性。