如何用jsrsasign手动生成JWE?CEK相关实现疑问
手动构建JWE时的CEK生成与加密问题解答
关于CEK(ArrayBuffer)传入jsrsasign.KJUR.crypto.Cipher.encrypt的有效性问题
- jsrsasign的
Cipher.encrypt方法文档要求输入为字符串,直接传ArrayBuffer未报错是因为内部做了隐式转换,但这种转换存在风险:ArrayBuffer会被当作UTF-8字符串处理,而CEK是二进制密钥,部分字节值(如0x80以上)在UTF-8编码中无效,会导致字节丢失或篡改,最终生成的JWE加密密钥必然无效。 - 正确做法是将CEK的ArrayBuffer转成十六进制字符串传入:
这样能保证二进制数据完整传递,符合RFC7516对CEK加密的要求。// 假设cek是Uint8Array类型的CEK const cekHex = KJUR.crypto.Util.bintohex(cek); const encryptedCek = KJUR.crypto.Cipher.encrypt(publicKey, cekHex, 'RSA-OAEP');
关于getRandomHexOfNbits(256)生成的CEK数组长度问题
- 256位的CEK对应32字节,
getRandomHexOfNbits(256)返回的是64个字符的十六进制字符串(每个字节对应2个十六进制字符)。你得到33字节数组且首字节为0,大概率是转换方式错误导致的:比如错误地将十六进制字符串转成数字后再转数组,或者用了不匹配的转换工具。 - 用jsrsasign自带的
KJUR.crypto.Util.hextobin()转换十六进制字符串,得到的Uint8Array长度必然是32字节。如果转换后首字节确实是0,这是完全正常的随机结果——CEK是随机字节数组,任何字节值(包括0)都是合法的,不需要丢弃首字节,只要确保最终CEK是32字节即可。
内容的提问来源于stack exchange,提问作者epc
相关产品推荐
相关产品推荐

