You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS SwiftUI应用注册Passkey时rpIdHash不匹配求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:07:15