如何在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库手动添加标签:
- 先安装cbor依赖:
npm install cbor - 修改代码逻辑如下:
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
相关产品推荐
相关产品推荐

