Ejemplo n.º 1
0
        /// <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());
        }
Ejemplo n.º 2
0
        /// <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));
        }