iOS平台Passkey断言签名验证失败问题求助
iOS Passkey断言签名验证失败排查求助
尝试验证断言请求返回的签名但失败了,以下是相关数据和我的尝试:
相关数据
注册阶段数据
const attestationChallenge = 'p58vEOB1TJ0Rh3PSwyTKnujxmYYQmGka20bYBK8hw8sfL/2btBbNeSmIiycTsvFfEgGzp7X5JVkpW4FMer6mcT5DOcgfh10OGXUdFe51exz/mOuj7+TRIxQNcaJ0jv/QTT9kCvTRydo2ntP2gsf2oVnVH+nweTEG4iY9GNFwDcU='; const attestation = { id: 'XT39NMONrxoh29HHmyh35qwaS1o=', rawId: 'XT39NMONrxoh29HHmyh35qwaS1o=', response: { clientDataJSON: 'eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoicDU4dkVPQjFUSjBSaDNQU3d5VEtudWp4bVlZUW1Ha2EyMGJZQks4aHc4c2ZMXzJidEJiTmVTbUlpeWNUc3ZGZkVnR3pwN1g1SlZrcFc0Rk1lcjZtY1Q1RE9jZ2ZoMTBPR1hVZEZlNTFleHpfbU91ajctVFJJeFFOY2FKMGp2X1FUVDlrQ3ZUUnlkbzJudFAyZ3NmMm9WblZILW53ZVRFRzRpWTlHTkZ3RGNVIiwib3JpZ2luIjoiaHR0cHM6Ly90bXB0ZXN0NTU1LmJsb2Nrc29mdGxhYi5jb20ifQ==', attestationObject: 'o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YViY85atP17k4jCSodKGG3KumgFtv9mzmvanMjekolX24mVdAAAAAPv8MAcVTk7MjAtuAgVX170AFF09/TTDja8aIdvRx5sod+asGktapQECAyYgASFYIHSvWI6jrp0v03xk2GzDDnMFD3hkZ+Vu4IFvXLPBNUDLIlgg8E4TIs8fiErLT7nEeOI6gjb+zTsKSQjPi6bplGD4djA=' } };
断言阶段数据
const assertionChallenge = 'ECJ3xtuY4U71MEZyjRa8pKcFBPXkRORXkzNe43P-OpdITVirSPjpn9aTzfFUOM0Gd9yR-KI82RRkK0_nei-2zy0HXVSDvfQXwLsIZmXBY7uuwSEaDEB5G57fc3B3Uu1bv8tjLSsdpzp5BNSi5kWNIcImwTVmAyeeNXuKp8ZPhbs'; const assertion = { id: 'ibYKqMzdLS3eEYNZKzoYBuPHNlY=', rawId: 'ibYKqMzdLS3eEYNZKzoYBuPHNlY=', response: { clientDataJSON: 'eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiRUNKM3h0dVk0VTcxTUVaeWpSYThwS2NGQlBYa1JPUlhrek5lNDNQLU9wZElUVmlyU1BqcG45YVR6ZkZVT00wR2Q5eVItS0k4MlJSa0swX25laS0yenkwSFhWU0R2ZlFYd0xzSVptWEJZN3V1d1NFYURFQjVHNTdmYzNCM1V1MWJ2OHRqTFNzZHB6cDVCTlNpNWtXTkljSW13VFZtQXllZU5YdUtwOFpQaGJzIiwib3JpZ2luIjoiaHR0cHM6Ly90bXB0ZXN0NTU1LmJsb2Nrc29mdGxhYi5jb20ifQ==', authenticatorData: '85atP17k4jCSodKGG3KumgFtv9mzmvanMjekolX24mUdAAAAAA==', signature: 'MEUCIQCAJrsIKKXp7Fmw8jVzxH5eLVTZqSpx0OihDtGCbZ5/ywIgYH48xfQlAA6+lY0NjWsHa7+vwEzmGwEOU132zwAOYTo=', userHandle: 'SmU2Qm9NaDM3dW5sQVFUNU5FVGllZw==' } };
公钥JWK
{ "kty": "EC", "alg": "ES256", "crv": "P-256", "x": "dK9YjqOunS/TfGTYbMMOcwUPeGRn5W7ggW9cs8E1QMs=", "y": "8E4TIs8fiErLT7nEeOI6gjb+zTsKSQjPi6bplGD4djA=" }
我的观察与尝试
注意到签名存在固定模式:通常以ME开头,后续包含U、I、C、Q等字符。曾推测签名开头包含authenticator data的稳定哈希,但本次注册请求返回的格式为none,不适用于Apple凭证注册格式相关规范。
尝试将挑战与authenticator data拼接后验证仍未成功,尝试代码如下:
const authData = Buffer.from(assertion.response.authenticatorData, 'base64'); const { createHash, verify } = require('crypto'); const hash = createHash('sha256').update(Buffer.from(attestation.response.clientDataJSON, 'base64')).digest(); const concat = Buffer.concat([authData, hash]); const result = verify( null, concat, { key, format: 'jwk' }, // 上述JWK Buffer.from(assertion.response.signature, 'base64') ); console.log(result);
恳请协助排查iOS平台Passkey断言签名验证失败的问题。
内容的提问来源于stack exchange,提问作者user26530591
相关产品推荐
相关产品推荐

