/// <summary> /// 生成签名,返回TOKEN /// </summary> private byte[] sign(XJwtType xJwtType, byte[] payload, long expiry) { var ms = new MemoryStream(); /*计算header*/ var headerStream = new MemoryStream(); //java中默认转换大端 var expiryByte = expiry.ToByteArray().Order(ByteOrder.BIG_ENDIAN); headerStream.Write(expiryByte, 0, expiryByte.Length); var typeByte = (byte)xJwtType; headerStream.WriteByte(typeByte); //java中默认转换大端 var issueIdByte = issueId.ToByteArray().Order(ByteOrder.BIG_ENDIAN); headerStream.Write(issueIdByte, 0, issueIdByte.Length); //对应java=》Base64.getEncoder().encode(header)代码,java base64编码 var headerBase64 = headerStream.ToArray().EncoderJavaBase64(); ms.Write(headerBase64, 0, headerBase64.Length); var dotbyte = (byte)DOT; ms.WriteByte(dotbyte); var payloadBase64 = payload.EncoderJavaBase64(); ms.Write(payloadBase64, 0, payloadBase64.Length); //签名结果 var signResult = _hmac_sha256.ComputeHash(ms.ToArray()); //继续组装完整的JWTToken ms.WriteByte(dotbyte); var signResultBase64 = signResult.EncoderJavaBase64(); ms.Write(signResultBase64, 0, signResultBase64.Length); return(ms.ToArray()); }
/// <summary> /// XJwt 加密,签名 /// </summary> /// <param name="type"></param> /// <param name="json"></param> /// <param name="expiry"></param> /// <returns></returns> public string encryptAndSign(XJwtType type, string payload, long expiry) { //return null; MemoryStream byteStream = new MemoryStream(); /*payload部分*/ byte[] longPart = _r.NextLong().ToByteArray().Order(ByteOrder.BIG_ENDIAN); //var byteStream = new MemoryStream(); byteStream.Write(longPart, 0, longPart.Length); //写入payload数据 var payloadByte = Encoding.UTF8.GetBytes(payload); byteStream.Write(payloadByte, 0, payloadByte.Length); //计算padding填充,这里计算要填充多少个 byte padding = (byte)((16 - ((byteStream.Position + 1) & 0xF)) & 0xF); /* * 将填充多少个的实际值以字节填充进字节数组中直到填充足够 * 如:需要16位 - 当前内容位 如11 +1 表示需要填充4位 * 将4作为字节值填充 */ for (int i = 0; i < padding + 1; ++i) { byteStream.WriteByte(padding); } var inputByte = byteStream.ToArray(); /*装配好内容流之后,使用AES加密*/ var enBytes = _enCrypto.TransformFinalBlock(inputByte, 0, inputByte.Length); //payload字节数组有了 /*3、计算sign*/ var outByte = sign(type, enBytes, expiry); /*4、拼接结果返回*/ return(Encoding.UTF8.GetString(outByte)); }