iOS SwiftUI应用注册Passkey时rpIdHash不匹配求助
基于Apple提供的Food Truck示例代码,我在SwiftUI应用中实现Passkey登录功能,后端采用Node.js搭配@simplewebauthn包。目前Web端登录流程完全正常,但在SwiftUI应用中创建Passkey并将注册响应发送至服务器时,出现rpIdHash与预期值不匹配的问题。
在Swift端注册流程的末尾,handleAuthorizationResult(_ authorizationResult: ASAuthorizationResult, username: String? = nil)方法接收ASAuthorizationResult后,进入.passkeyRegistration分支(注册新Passkey的场景)。我将返回结果重构为如下结构的凭证对象:
{ "id": passkeyRegistration.credentialID, "rawId": passkeyRegistration.credentialID, "type": "public-key", "authenticatorAttachment": "platform", "response": { "clientDataJSON": passkeyRegistration.rawClientDataJSON, "attestationObject": passkeyRegistration.rawAttestationObject, "transports": ["internal","hybrid"] } }
该对象能在后端正常解码,但Apple返回的attestationObject中的rpIdHash为:[203,189,6,160,8,217,220,110,195,214,214,218,140,243,77,214,79,53,154,17,152,74,224,35,148,70,128,25,42,14,122,101]
与后端预期的rpIdHash:[203,189,6,160,8,217,220,110,195,214,214,218,140,243,77,214,79,53,154,17,152,74,239,227,148,70,190,25,42,14,122,101]
仅三个字节存在差异:
- 预期值:第22位239、第23位227、第26位190
- 接收值:第22位224、第23位35、第26位128
我尝试过多种rpIdHash样本排查问题,但始终无法匹配Apple ASAuthorizationResult返回的哈希值。由于哈希过程不由我控制,恳请提供修复方案。
附:@simplewebauthn使用的哈希函数代码(注释已翻译):
/** * 返回给定数据的哈希摘要,若指定算法则使用指定算法,默认使用SHA-256。 */ export function toHash( data: Uint8Array | string, algorithm: COSEALG = -7, ): Promise<Uint8Array> { if (typeof data === 'string') { data = isoUint8Array.fromUTF8String(data); } const digest = isoCrypto.digest(data, algorithm); return digest; }
内容的提问来源于stack exchange,提问作者Rodrigue2g

