gpt4 book ai didi

javascript - 关于使用 Cloud KMS 进行签名验证的问题

转载 作者:行者123 更新时间:2023-12-04 07:25:14 27 4
gpt4 key购买 nike

我正在尝试验证使用 Google 的云 KMS 生成的签名,但我不断收到无效响应。
这是我测试它的方式:

const versionName = client.cryptoKeyVersionPath(
projectId,
locationId,
keyRingId,
keyId,
versionId
)

const [publicKey] = await client.getPublicKey({
name: versionName,
})

const valueToSign = 'hola, que tal'

const digest = crypto.createHash('sha256').update(valueToSign).digest()

const [signResponse] = await client.asymmetricSign({
name: versionName,
digest: {
sha256: digest,
},
})

const valid = crypto.createVerify('sha256').update(digest).verify(publicKey.pem, signResponse.signature)

if (!valid) return console.log('INVALID SIGNATURE')

console.log('SIGNATURE IS VALID!')

// output: INVALID SIGNATURE
此代码将始终记录“无效签名” 除非我使用原始消息而不是其哈希:
const valid = crypto.createVerify('sha256').update(valueToSign).verify(publicKey.pem, signResponse.signature) // true
但是使用本地私钥,我可以对消息进行签名并使用它们的哈希验证它们:
const valueToSign = 'hola, the tal'
const msgHash = crypto.createHash("sha256").update(valueToSign).digest('base64');

const signer = crypto.createSign('sha256');
signer.update(msgHash);
const signature = signer.sign(pk, 'base64');

const verifier = crypto.createVerify('sha256');
verifier.update(msgHash);
const valid = verifier.verify(pubKey, signature, 'base64');
console.log(valid) // true
为什么? kms签名有什么不同吗?

最佳答案

基于 this example根据加密模块文档和您的观察,我想说您可能误解了 client.asymmetricSign作品。让我们分析一下会发生什么:
您的本地私钥代码:

const valueToSign = 'hola, the tal'

// Create sha256 hash
const msgHash = crypto.createHash("sha256").update(valueToSign).digest('base64');

// Let signer sign sha256(hash)
const signer = crypto.createSign('sha256');
signer.update(msgHash);
const signature = signer.sign(pk, 'base64');
// We now got sign(sha256(hash))

// Let verifier verify sha256(hash)
const verifier = crypto.createVerify('sha256');
verifier.update(msgHash);

const valid = verifier.verify(pubKey, signature, 'base64');
console.log(valid) // true
我们正在验证 sign(sha256(hash))使用 verify(sha256(hash)) .

您的 KMS 代码:
const valueToSign = 'hola, que tal'

// Create sha256 hash
const digest = crypto.createHash('sha256').update(valueToSign).digest()

// Let KMS sign the hash
const [signResponse] = await client.asymmetricSign({
name: versionName,
digest: {
sha256: digest, // we already say "we hashed our data using sha256"
},
});
// We now got `sign(hash)`, NOT `sign(sha256(hash))` (where hash == digest)

// Let verifier verify sha256(hash)
const valid = crypto.createVerify('sha256').update(digest).verify(publicKey.pem, signResponse.signature)
我们正在验证 sign(hash)使用 verify(sha256(hash)) .

基本上,您在本地签名 你的哈希值 并验证签名的哈希。使用 KMS,您正在签署 您的数据 并验证签名的哈希,实际上是您签名的 数据 ,因此您第二次尝试使用 .update(valueToSign)作品。
解决方案?在让 KMS 签名之前再次散列您的 sha256 散列,因为 KMS 期望待签名数据的 sha256 哈希 ,而 crypto期望要签名的数据(给定您传递给 createSign 的算法,它会自行散列)。

关于javascript - 关于使用 Cloud KMS 进行签名验证的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68241086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com