今天给大家介绍的是一款名叫 Branca 的加密令牌, Branca 使用了现代密码学算法来对 API 令牌进行认证和加密, 并可用于多种在线服务之中
工具介绍
Branca 是一种易于使用的令牌格式, 并且它的易于使用并不是以牺牲安全性换取来的它使用了 IETF XChaCha20-Poly1305 AEAD 对称加密算法来生成防篡改的加密令牌, Payload 本身是任意字节序列, 你可以使用 JSON 对象明文字符串或任意序列化二进制数据
设计目标
1. 安全第一;
2. 易于实现和使用;
3. 更小的令牌体积;
令牌格式
Branca 令牌由 header 密文 (Cyphertext) 和一个认证标识 (Tag) 组成, 其中 header 由版本信息 (Version) 时间戳 (Timestamp) 和随机数 (Nonce) 组成将这些信息组合在一起之后, 我们得到了下列数据结构:
Version(1B) || Timestamp (4B) || Nonce (24B) || Ciphertext (*B) || Tag (16B)
代表上述二进制令牌的字符串必须使用 base62 编码, 可选的字符集如下:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy
版本信息(Version)
版本信息长度为 8 位, 当前的版本信息为 0xBA, 你可以用它来识别已有的令牌, 版本信息可以用来确定令牌格式和加密算法
时间戳(Timestamp)
时间戳为 32 位, 它是无符号的大端 4 字节 UNIX 时间戳时间戳可以帮助验证方判断令牌的生成时间以确定其当前是否仍然有效除此之外, 以无符号整形存储时间戳可以帮助我们避免 2038 年问题, 因为研究人员预测到 2106 年才会出现无符号整形溢出的问题
随机数(Nonce)
随机数长度为 192 位, 随机数必须是经过安全加密的随机字节, 并且不会在令牌间重复使用
密文(Cyphertext)
Payload 使用 IETFXChaCha20-Poly1305 来进行加密和认证, 但 header 中的数据 (版本信息(Version) 时间戳 (Timestamp) 和随机数 (Nonce)) 并没有进行加密(只需要认证), 因为在某些人眼里, header 只能被查看到, 却不能被篡改
认证标识(Tag)
认证 Tag 为 128 位, 它是一种 Poly1305 消息认证码, 可以用来确保 Payload 以及其他未加密 Header 不被篡改
令牌使用
我们假设你的密码库支持组合模式, 在组合模式下, 认证标识 Tag 以及加密消息需要存储在一起如果你的密码库不支持组合模式, tag 就是 ciphertext|tag 组合的最后 16 字节数据
生成令牌
一个 256 位的密钥 key 加上任意 Payload, 我们就可以按照下列步骤生成令牌:
1. 生成安全加密随机数
2. 如果用户没有提供时间戳, 则使用当前的 unixtime
3. 通过组合 versiontimestamp 和 nonce 来构造 header
4. 使用 IETF XChaCha20-Poly1305 AEAD 以及用户提供的密钥来对 Payload 进行加密
5. 使用 Base62 对整个令牌进行编码
验证令牌
用户可以按照下列步骤恢复原始的未加密 Payload:
1. 使用 Base62 对令牌进行解码
2. 确保解码后的令牌第一个字节为 0xBA
3. 提取 header
4. 提取 nonce
5. 提取 timestamp
6. 提取 ciphertext|tag 组合
7. 使用 IETF XChaCha20-Poly1305 AEAD 解密并验证 ciphertext|tag 组合
代码库
当前已实现 Branca 令牌的项目如下:
编程语言 | 许可证协议 | 使用的加密代码库 |
MIT | ||
MIT | ||
MIT | ||
MIT | ||
MIT |
许可证协议
来源: http://jaq.alibaba.com/community/art/show?articleid=1583