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

如何在cose-js生成的COSE签名中添加标识cose-sign1的CBOR标签18

cose-js生成带18标签COSE_Sign1结构的解决方法

cose-js的cose.sign.create方法默认输出不带标签的裸COSE_Sign1数组结构,你可以通过以下两种方式添加值为18的CBOR标签:

方法1:使用内置参数(推荐,适用于cose-js v0.9及以上版本)

调用签名方法时新增第四个配置参数,开启explicitTag选项即可自动生成带标签的结构,修改后代码如下:

const payload = Buffer.from('mysecretfoodrecipe', 'base64') 
const headers = {
  'p': {'alg': 'ES256', 'kid': 'chefsid'},
  'u': []
};
const signer = {
  'key': {
    'd': Buffer.from('mysecretrecipesignature', 'hex')
  }
};

cose.sign.create(
  headers,
  payload,
  signer,
  { explicitTag: true } // 开启后自动追加值为18的COSE_Sign1专属CBOR标签
)
.then((buf) => {
  console.log('Signed message: ' + buf.toString('hex'));
  return buf.toString('hex')
}).catch((error) => {
  console.log(error);
});

验证方式:输出的十六进制结果开头为d2,对应CBOR标准中标签号18的编码,结构完全符合你需要的{Number: 18 Content: [[受保护头, 未受保护头], [载荷], [签名]]}格式。

方法2:手动打标签(兼容旧版本cose-js)

如果你使用的版本不支持上述配置,可以借助cbor库手动添加标签:

  1. 先安装cbor依赖:npm install cbor
  2. 修改代码逻辑如下:
const cbor = require('cbor');
const payload = Buffer.from('mysecretfoodrecipe', 'base64') 
const headers = {
  'p': {'alg': 'ES256', 'kid': 'chefsid'},
  'u': []
};
const signer = {
  'key': {
    'd': Buffer.from('mysecretrecipesignature', 'hex')
  }
};

cose.sign.create(
  headers,
  payload,
  signer
)
.then((rawBuf) => {
  // 解码原始裸结构,封装为18号标签后重新编码
  const taggedContent = new cbor.Tagged(18, cbor.decode(rawBuf));
  const resultBuf = cbor.encode(taggedContent);
  console.log('Signed message: ' + resultBuf.toString('hex'));
  return resultBuf.toString('hex')
}).catch((error) => {
  console.log(error);
});

内容的提问来源于stack exchange,提问作者Julius Goddard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:45:04