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

如何使用Node.js crypto库验证HashiCorp Vault生成的签名?

如何使用Node.js crypto库验证HashiCorp Vault生成的签名?

嘿,我帮你梳理下为啥Node crypto验证Vault签名失败的问题,主要是几个细节没和Vault的签名逻辑对齐,咱们一步步来修正:

问题根源

你当前的代码有两个核心错误:

  1. 验证数据不对:你传给crypto.verify的是base64编码后的字符串data1,但Vault实际签名的是解码后的原始数据(也就是test这个字符串的字节内容)。
  2. 签名算法/填充方式可能不匹配:你只用了SHA256作为算法参数,但Vault的Transit签名默认是基于RSA的完整签名方案,需要明确指定。

修正后的代码

我把代码调整好了,你可以直接运行,关键改动我会标注:

const crypto = require('crypto');
const fs = require('fs');

// 读取Vault导出的PEM格式公钥
const publicKey = fs.readFileSync('./hashicorp.key', 'utf8');

// 重点:用原始数据(和Vault收到的input解码后一致)
const originalData = Buffer.from("test", "utf-8");
// Vault返回的base64格式签名
const signature = "X2+xXGSnc/Vdk3KvPMlnHqT4uMMC6oAB+FHlQWvpoKXwAH+dFwX6uodPH7fCw1uQyQ4B7yuNATBYju/UDsosBiGBNUopzTMwoASACPA2Neo+jfgvBfAkC/LJMJ7pHZI3pkoIt43/QxjhjW1tHu7S5jfjTG0YaYe2vWstiuT7HcWpU0giVBKcN6oTBm9kcgMoTAEWFnqre7q1QpPXLEaQUJB4veQhcDR1us8B4cK6EhP8kNdu6a3x2FKw9CWiORv1lr/lB+yV1Y2mShkLL3uBgvQTswq9wqRBv57mX6O8nLXADkn+t4N4LIpyy3M0VdWcOVkpaCqLsnA8u76f32HArA==";

// 先尝试默认的PKCS#1 v1.5填充验证
let isValid = crypto.verify(
  'RSA-SHA256', 
  originalData, 
  publicKey, 
  Buffer.from(signature, 'base64')
);

// 如果上面验证失败,试试PSS填充(Vault部分配置会用这个)
if (!isValid) {
  const verifier = crypto.createVerify('RSA-SHA256');
  verifier.update(originalData);
  isValid = verifier.verify(publicKey, Buffer.from(signature, 'base64'), {
    padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
    saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST // 用哈希长度作为salt长度,和Vault默认对齐
  });
}

console.log("Is Valid - ", isValid);

关键细节说明

  • 数据必须对齐:Vault的transit/sign接口收到input参数后,会先把base64字符串解码成原始字节,再做SHA-256哈希并签名。所以你本地验证时,必须用未编码的原始数据,不能用base64后的字符串。
  • 签名算法匹配:
    • 默认情况下,Vault的RSA密钥用PKCS#1 v1.5填充签名,对应Node crypto的RSA-SHA256算法。
    • 如果你的Vault密钥配置了signature_algorithm为pss,就需要用代码里的PSS填充验证逻辑。
  • 公钥格式要正确:确保从Vault导出的公钥是标准PEM格式(带有-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----头尾),Node crypto才能正常解析。

额外排查点

如果还是验证失败,可以检查这几点:

  • 确认公钥和生成签名的Vault密钥是同一对:可以通过Vault的transit/export/public接口重新导出公钥试试。
  • 检查签名接口参数:调用transit/sign时有没有加prehashed=true?如果加了,Vault会直接对传入的base64哈希值签名,这时你本地要传入原始哈希而非原始数据。
  • 确认签名字符串没有被截断或修改:复制的时候要完整保留Vault返回的base64内容。

备注:内容来源于stack exchange,提问作者viveksharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:59:29