public string Encode(OwnerToken token)
        {
            var ownerTypeBys  = NetBitConverter.GetBytes(token.OwnerType);
            var ownerIdBys    = NetBitConverter.GetBytes(token.OwnerId);
            var expireTimeBys = GetBytes(token.ExpireTime);


            var lstLen  = 1 + ownerTypeBys.Length + ownerIdBys.Length + expireTimeBys.Length;
            var mdatLst = new List <byte>(lstLen);

            mdatLst.Add(CurrentVersion);
            mdatLst.AddRange(ownerTypeBys);
            mdatLst.AddRange(ownerIdBys);
            mdatLst.AddRange(expireTimeBys);
            var mdatBys = mdatLst.ToArray();

            //签名
            var signBys = ArrayUtil.Addition(_appSecretBytes, mdatBys);
            var hashBys = Sha1(signBys);

            //编码成字符串
            var encBys = ArrayUtil.Addition(hashBys, mdatBys);

            return(_urlDataCodec.Encode(encBys));
        }
        public string Encode(FileToken token)
        {
            var pseudoIdBys       = NetBitConverter.GetBytes(token.PseudoId);
            var fileIdBys         = NetBitConverter.GetBytes(token.FileId);
            var ownerIdBys        = NetBitConverter.GetBytes(token.FileOwnerId);
            var mimeBys           = NetBitConverter.GetBytes(token.MimeId);
            var expireTimeBys     = GetBytes(token.ExpireTime);
            var fileCreateTimeBys = GetBytes(token.FileCreateTime);

            var lstLen  = 1 + pseudoIdBys.Length + fileIdBys.Length + ownerIdBys.Length + mimeBys.Length + expireTimeBys.Length + fileCreateTimeBys.Length;
            var mdatLst = new List <byte>(lstLen);

            mdatLst.Add(CurrentVersion);
            mdatLst.AddRange(pseudoIdBys);
            mdatLst.AddRange(fileIdBys);
            mdatLst.AddRange(ownerIdBys);
            mdatLst.AddRange(mimeBys);
            mdatLst.AddRange(expireTimeBys);
            mdatLst.AddRange(fileCreateTimeBys);

            var mdatBys = mdatLst.ToArray();

            //签名
            var signBys = ArrayUtil.Addition(_appSecretBytes, mdatBys);
            var hashBys = Md5(signBys);

            //编码成字符串
            var encBys = ArrayUtil.Addition(hashBys, mdatBys);

            return(_urlDataCodec.Encode(encBys));
        }
        public FileToken Decode(string tokenStr)
        {
            var encBys = _urlDataCodec.Decode(tokenStr);

            //校验签名
            var hashLen = 16;
            var mdatBys = new byte[encBys.Length - hashLen];

            Array.Copy(encBys, hashLen, mdatBys, 0, mdatBys.Length);
            var signBys = ArrayUtil.Addition(_appSecretBytes, mdatBys);
            var hashBys = Md5(signBys);

            if (!ArrayUtil.Equals(hashBys, 0, encBys, 0, hashLen))
            {
                throw new InvalidDataException("bad sign");
            }

            if (mdatBys[0] != CurrentVersion)
            {
                throw new NotSupportedException("bad token version");
            }

            //解析成对象
            var index    = 1; //忽略版本
            var pseudoId = NetBitConverter.ToUInt32(mdatBys, index);

            index += 4;
            var fileId = NetBitConverter.ToInt32(mdatBys, index);

            index += 4;
            var ownerId = NetBitConverter.ToInt32(mdatBys, index);

            index += 4;
            var mimeId = NetBitConverter.ToUInt32(mdatBys, index);

            index += 4;
            var expireTime = ToDateTime(mdatBys, index);

            index += sizeof(long);
            var fileCreateTime = ToDateTime(mdatBys, index);

            return(new FileToken
            {
                PseudoId = pseudoId,
                FileId = fileId,
                FileOwnerId = ownerId,
                MimeId = mimeId,
                ExpireTime = expireTime,
                FileCreateTime = fileCreateTime
            });
        }
        public OwnerToken Decode(string tokenStr)
        {
            var encBys = _urlDataCodec.Decode(tokenStr);

            //校验签名
            var hashLen = 20;
            var mdatBys = new byte[encBys.Length - hashLen];

            Array.Copy(encBys, hashLen, mdatBys, 0, mdatBys.Length);
            var signBys = ArrayUtil.Addition(_appSecretBytes, mdatBys);
            var hashBys = Sha1(signBys);

            if (!ArrayUtil.Equals(hashBys, 0, encBys, 0, hashLen))
            {
                throw new InvalidDataException("bad sign");
            }

            if (mdatBys[0] != CurrentVersion)
            {
                throw new NotSupportedException("bad token version");
            }

            //解析成对象
            var index     = 1; //忽略版本
            var ownerType = NetBitConverter.ToInt32(mdatBys, index);

            index += 4;
            var ownerId = NetBitConverter.ToInt32(mdatBys, index);

            index += 4;
            var expireTime = ToDateTime(mdatBys, index);

            return(new OwnerToken
            {
                OwnerType = ownerType,
                OwnerId = ownerId,
                ExpireTime = expireTime
            });
        }