PHP服务器实现App Attest时公钥SHA256哈希验证失败求助
解决App Attest验证第5步:公钥SHA256哈希与CredentialId匹配问题
你需要哈希的是公钥的DER编码原始二进制字节,而非PEM格式的字符串。以下是针对你现有变量的PHP实现步骤:
正确代码示例
// 从已获取的公钥PEM中提取DER编码的原始字节 $cleanPem = preg_replace('/-----BEGIN PUBLIC KEY-----\n?|\n?-----END PUBLIC KEY-----/', '', $keyPem); $publicKeyDer = base64_decode($cleanPem); // 计算公钥DER字节的SHA256原始哈希(注意第三个参数为true,返回二进制数据) $computedCredentialId = hash('sha256', $publicKeyDer, true); // 安全对比计算出的哈希与从authData提取的$credentialId if (hash_equals($computedCredentialId, $credentialId)) { // 验证通过 } else { // 验证失败 }
关键注意事项
- 必须使用二进制哈希:
hash函数第三个参数设为true,返回原始二进制哈希值,因为$credentialId是从authData中提取的原始字节,而非十六进制字符串。如果之前尝试时没加这个参数,得到的十六进制字符串自然无法匹配。 - 清理PEM格式要彻底:确保移除PEM头、尾的精确标记,包括可能存在的换行符,否则base64解码会出错,导致哈希结果错误。
- Apple文档对应关系:App Attest文档第5步要求的"credCert中公钥的SHA256哈希",本质就是公钥DER编码的SHA256原始哈希,它与
$credentialId(密钥标识符)是同一值。
内容的提问来源于stack exchange,提问作者gbalduzzi
相关产品推荐
相关产品推荐

