验证失败

This commit is contained in:
cheney
2026-04-04 18:06:09 +08:00
parent 959f058def
commit 03169b5165
6 changed files with 285 additions and 34 deletions
+16 -34
View File
@@ -380,55 +380,37 @@ function verifyPKCS7WithJsrsasign(base64Data, verifyData) {
// 计算 SM3 哈希
const hash = sm3(verifyData.toString())
// 转换签名格式:从 ASN.1 DER 格式转换为原始 r|s 格式
// 签名格式:用户提供的是 ASN.1 DER 格式,需要使用 der: true 选项
let signatureHex = signer.sighex
if (signatureHex.startsWith('30')) {
// ASN.1 DER 格式: 30 44 02 20 [r] 02 20 [s]
try {
const rStart = 8 // 30440220
const r = signatureHex.substring(rStart, rStart + 64) // 32字节 = 64 hex 字符
const sStart = rStart + 64 + 4 // 0220
const s = signatureHex.substring(sStart, sStart + 64) // 32字节 = 64 hex 字符
signatureHex = r + s
} catch (e) {
// 如果解析失败,使用原始签名
}
}
// 使用 SM2 验证签名 (注意:使用 doVerifySignature,不是 doVerify)
// 尝试不同的选项组合
// 尝试不同的选项组合,包括 userId
const userId = '1234567812345678' // 默认 userId
try {
// 尝试 1: 直接验证
const result1 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex)
// 尝试 1: 使用原始数据 + DER + SM3 + userId
const result1 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true, hash: true, userId })
if (result1) return true
// 尝试 2: 使用 DER 格式
const result2 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true })
// 尝试 2: 使用原始数据 + DER + SM3
const result2 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true, hash: true })
if (result2) return true
// 尝试 3: 使用 SM3 哈希
const result3 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { hash: true })
// 尝试 3: 使用原始数据 + DER
const result3 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true })
if (result3) return true
// 尝试 4: 同时使用 DER 和 SM3
const result4 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true, hash: true })
// 尝试 4: 使用哈希 + DER + SM3 + userId
const result4 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true, hash: true, userId })
if (result4) return true
// 尝试 5: 直接使用原始数据而不是哈希
const result5 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex)
// 尝试 5: 使用哈希 + DER + SM3
const result5 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true, hash: true })
if (result5) return true
// 尝试 6: 使用原始数据 + DER
const result6 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true })
// 尝试 6: 使用哈希 + DER
const result6 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true })
if (result6) return true
// 尝试 7: 使用原始数据 + SM3
const result7 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { hash: true })
if (result7) return true
// 尝试 8: 所有选项
const result8 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true, hash: true })
if (result8) return true
} catch (e) {
// 忽略错误,继续尝试其他选项
}