宾托肯
Bintoken 是一个固定长度的编码二进制消息,意在作为可以签名的信息. 根据类型字节,以及谁在宾托肯上签名,消息可能具有不同的含义.
例如,如果该类型表示消息是认证符,而宾托肯由服务器的私人密钥签名,这可能会提供一种保证,即服务器在宾托肯指定的时间验证出一些信息.
符号的编码格式通过即时 BintokenEncoding 此软件包导出类别。 编码用每个属性的属性名称和长度来指定. 密钥名称在编码和解码宾托肯时按字母顺序排序.
决定二进制格式简化了签名验证. 它的固定长度简化了解码和验证,从而减少了恶意剥削的机会. 与JSON等其他格式不同,只有 一个 在宾托肯编码方案中编码消息的方式.
以下是任何宾托肯编码的通用序列化格式:
- 类型(1字节) : 可用于识别信件上下文的版本编号.
- [... 负载属性]
- 时间(4个字节):创建消息时的时间戳(以unix秒计),编码为大端的uint32.
示例
以下是一个宾托肯编码的例子,它只将32字节的公钥编码为有效载荷:
const BintokenEncoding = require('@exodus/bintoken')
const tokenEncoding = new BintokenEncoding({ publicKey: 32, hash: 20 })
const token = tokenEncoding.toBuffer({
type: 1,
publicKey: randomBytes(32),
hash: randomBytes(20),
})
/*
// Erroneous use
const token = tokenEncoding.toBuffer({ type: 1, publicKey: randomBytes(32), hash: randomBytes(20), otherProp: Buffer.alloc(0) })
const token = tokenEncoding.toBuffer({ type: 1, publicKey: randomBytes(31), hash: randomBytes(20) })
const token = tokenEncoding.toBuffer({ type: 1, publicKey: 'foo', hash: randomBytes(20) })
const token = tokenEncoding.toBuffer({ type: 1 })
*/
const { type, time, publicKey, hash } = tokenEncoding.fromBuffer(token)
/*
// Error, wrong length
const { type, time, publicKey } = tokenEncoding.fromBuffer(
Buffer.concat([token, Buffer.alloc(1)])
)
*/
在这个例子中,序列化格式是:
- 类型(1字节) : 可用于识别信件上下文的版本编号.
- hash (20) 字节 : 消息具有意义(如类型所暗示的) 的散列.
- public key (32字节) : 消息具有意义(由类型所暗示)的公钥.
- 时间(4个字节):信息创建时的时间戳(以秒为单位),编码为大端的uint32.
注意到 hash 写入 在此之前 publicKey 在有效载荷中,因为属性在被写入或读出宾托肯之前按字母顺序排序。 这意味着 您为您信件选择的密钥必须使用相同的宾肯对不同的应用程序相同.