Beispiel #1
0
        /// <summary>
        /// 数据传到Hub之前进行数据解密
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
        {
            //_canCrypto = CanCrypto(context.Hub.Context);
            //if (!_canCrypto)
            //{
            //    return base.OnBeforeIncoming(context);
            //}
            //数据解密
            string facePublicKey = context.Hub.Context.Headers.Get(HttpHeaderNames.MesClientPublicKey);

            if (string.IsNullOrEmpty(facePublicKey))
            {
                return(false);
            }
            _cryptor = new CommunicationCryptor(_ownPrivateKey, facePublicKey, _hashType);
            if (context.Args.Count == 1)
            {
                string         encrypt = (string)context.Args[0];
                string         json    = _cryptor.DecryptAndVerifyData(encrypt);
                IList <object> args    = JsonConvert.DeserializeObject <IList <object> >(json);
                context.Args.Clear();
                IList <object> values = context.MethodDescriptor.Parameters.Zip(args, (desc, arg) => ResolveParameter(desc, arg)).ToList();
                foreach (object arg in values)
                {
                    context.Args.Add(arg);
                }
            }
            return(base.OnBeforeIncoming(context));
        }
Beispiel #2
0
        private HttpResponseMessage DecryptResponse(HttpResponseMessage response)
        {
            if (!response.IsSuccessStatusCode)
            {
                return(response);
            }
            string data = response.Content.ReadAsStringAsync().Result;

            if (string.IsNullOrEmpty(data))
            {
                return(response);
            }
            try
            {
                data = CommunicationCryptor.DecryptAndVerifyData(data, _clientPrivateKey, _hashType, _publicKey);
                if (data == null)
                {
                    throw new OBearException(Resources.Http_Security_Client_VerifyResponse_Failt);
                }
                HttpContent content = new StringContent(data);
                content.Headers.ContentType = response.Content.Headers.ContentType;
                response.Content            = content;
                return(response);
            }
            catch (Exception ex)
            {
                //HttpError error = new HttpError(Resources.Http_Seciruty_Client_DecryptResponse_Failt);
                response = response.RequestMessage.CreateErrorResponse(HttpStatusCode.InternalServerError, Resources.Http_Seciruty_Client_DecryptResponse_Failt);
                return(response);
            }
        }
Beispiel #3
0
        /// <summary>
        /// 数据传到Hub之前进行数据解密
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
        {
            _canCrypto = CanCrypto(context.Hub.Context);
            if (!_canCrypto)
            {
                return(base.OnBeforeIncoming(context));
            }
            //数据解密
            string facePublicKey = context.Hub.Context.Headers.Get(HttpHeaderNames.OSharpClientPublicKey);

            if (string.IsNullOrEmpty(facePublicKey))
            {
                return(false);
            }
            _cryptor = new CommunicationCryptor(_ownPrivateKey, facePublicKey, _hashType);
            if (context.Args.Count == 1)
            {
                string         encrypt = (string)context.Args[0];
                string         json    = _cryptor.DecryptAndVerifyData(encrypt);
                IList <object> args    = JsonConvert.DeserializeObject <IList <object> >(json);
                context.Args.Clear();
                foreach (object arg in args)
                {
                    context.Args.Add(arg);
                }
            }
            return(base.OnBeforeIncoming(context));
        }
Beispiel #4
0
        private HttpResponseMessage EncryptResponse(HttpResponseMessage response)
        {
            if (!response.IsSuccessStatusCode)
            {
                return(response);
            }
            if (response.Content == null)
            {
                return(response);
            }
            string data = response.Content.ReadAsStringAsync().Result;

            try
            {
                data = CommunicationCryptor.EncryptData(data, _privateKey, _publicKey, _hashType);
                HttpContent content = new StringContent(data);
                content.Headers.ContentType = response.Content.Headers.ContentType;
                response.Content            = content;
                return(response);
            }
            catch (Exception)
            {
                HttpError error = new HttpError(Resources.Http_Security_Host_EncryptResponse_Failt);
                return(response.RequestMessage.CreateErrorResponse(HttpStatusCode.BadRequest, error));
            }
        }
 /// <summary>
 /// 加密初始化
 /// </summary>
 /// <param name="facePublicKey">对方公钥</param>
 /// <param name="hashType">摘要哈希方式,值必须为MD5或SHA1</param>
 public void CryptoInitialize(string facePublicKey, string hashType)
 {
     if (_cryptor == null)
     {
         RsaHelper ownRsa = new RsaHelper();
         Headers.Add(HttpHeaderNames.OSkyClientPublicKey, ownRsa.PublicKey);
         _cryptor = new CommunicationCryptor(ownRsa.PrivateKey, facePublicKey, hashType);
     }
 }
        /// <summary>
        /// 使用服务端公钥初始化<see cref="ClientCryptoDelegatingHandler"/>类的新实例
        /// </summary>
        /// <param name="publicKey">服务端公钥</param>
        /// <param name="hashType">签名哈希类型,必须为MD5或SHA1</param>
        public ClientCryptoDelegatingHandler(string publicKey, string hashType = "MD5")
        {
            publicKey.CheckNotNullOrEmpty("publicKey");
            hashType.CheckNotNullOrEmpty("hashType");
            hashType = hashType.ToUpper();
            hashType.Required(str => hashType == "MD5" || hashType == "SHA1", Resources.Http_Security_RSA_Sign_HashType);
            RsaHelper rsa = new RsaHelper();

            _cryptor         = new CommunicationCryptor(rsa.PrivateKey, publicKey, hashType);
            _clientPublicKey = rsa.PublicKey;
        }
Beispiel #7
0
        private Task <HttpResponseMessage> DecryptRequest(HttpRequestMessage request)
        {
            if (!request.Headers.Contains(HttpHeaderNames.TomNetClientPublicKey))
            {
                return(CreateResponseTask(request, HttpStatusCode.BadRequest, "在请求头中客户端公钥信息无法找到。"));
            }
            string publicKey = request.Headers.GetValues(HttpHeaderNames.TomNetClientPublicKey).First();

            _cryptor = new CommunicationCryptor(_privateKey, publicKey, _hashType);

            if (request.Content == null)
            {
                return(null);
            }
            string data = request.Content.ReadAsStringAsync().Result;

            if (string.IsNullOrEmpty(data))
            {
                return(null);
            }
            try
            {
                if (_cryptor != null)
                {
                    data = _cryptor.DecryptAndVerifyData(data);
                }
                if (data == null)
                {
                    throw new TomNetException("服务器解析请求数据时发生异常。");
                }
                HttpContent content = new StringContent(data);
                content.Headers.ContentType = request.Content.Headers.ContentType;
                request.Content             = content;
                return(null);
            }
            catch (CryptographicException ex)
            {
                const string message = "服务器解析传输数据时发生异常。";
                Logger.Error(message, ex);
                return(CreateResponseTask(request, HttpStatusCode.BadRequest, message, ex));
            }
            catch (Exception ex)
            {
                Logger.Error(Resources.Http_Security_Host_DecryptRequest_Failt, ex);
                return(CreateResponseTask(request, HttpStatusCode.BadRequest, Resources.Http_Security_Host_DecryptRequest_Failt, ex));
            }
        }
Beispiel #8
0
 private Task <HttpResponseMessage> CreateResponseTask(HttpRequestMessage request,
                                                       HttpStatusCode statusCode,
                                                       string message,
                                                       Exception ex = null)
 {
     return(Task <HttpResponseMessage> .Factory.StartNew(() =>
     {
         if (statusCode >= HttpStatusCode.OK && statusCode <= (HttpStatusCode)299)
         {
             if (_publicKey != null)
             {
                 message = CommunicationCryptor.EncryptData(message, _privateKey, _publicKey, _hashType);
                 return request.CreateResponse(statusCode, message);
             }
         }
         HttpResponseMessage response = request.CreateErrorResponse(statusCode, ex == null ? new HttpError(message) : new HttpError(ex, false));
         return response;
     }));
 }
Beispiel #9
0
        private Task <HttpResponseMessage> EncryptRequest(HttpRequestMessage request)
        {
            request.Headers.Add(HttpHeaderNames.OBearClientPublicKey, _clientPublicKey);

            if (request.Method == HttpMethod.Get || request.Content == null)
            {
                return(null);
            }
            string data = request.Content.ReadAsStringAsync().Result;

            try
            {
                data = CommunicationCryptor.EncryptData(data, _clientPrivateKey, _publicKey, _hashType);
                HttpContent content = new StringContent(data);
                content.Headers.ContentType = request.Content.Headers.ContentType;
                request.Content             = content;
                return(null);
            }
            catch (Exception ex)
            {
                return(CreateResponseTask(request, HttpStatusCode.BadRequest, Resources.Http_Security_Client_EncryptRequest_Failt, ex));
            }
        }