Exemplo n.º 1
0
        /// <summary>
        /// 检查消息有效性
        /// </summary>
        /// <param name="strMsg"></param>
        /// <param name="strRSAPublicKey"></param>
        /// <returns></returns>
        private static bool IsValidOutTaskMsg(string strMsg, string strRSAPublicKey)
        {
            JavaScriptSerializer      js     = new JavaScriptSerializer();
            S2CMessage_OutTaskRequest result = new S2CMessage_OutTaskRequest();
            dynamic data;

            try
            {
                data = js.Deserialize <dynamic>(strMsg);   // 反序列化
            }
            catch (Exception e)
            {
                LOGGER.WARN($"Server out task request is not a invalid JSON format. \n Error = {e.ToString()} \n Request = {strMsg}");
                return(false);
            }

            try
            {
                result.info.taskID        = int.Parse(data["taskID"]);
                result.info.nodeID        = int.Parse(data["nodeID"]);
                result.info.fromBankCode  = data["fromBankCode"];
                result.info.fromBankName  = data["fromBankName"];
                result.info.fromAccount   = data["fromAccount"];
                result.info.password      = data["password"];
                result.info.tradePassword = data["tradePassword"];
                result.info.toBankCode    = data["toBankCode"];
                result.info.toBankName    = data["toBankName"];
                result.info.toAccount     = data["toAccount"];
                result.info.holderName    = data["holderName"];
                result.info.amount        = data["amount"];
                result.info.remarks       = data["remarks"];
                result.timestamp          = long.Parse(data["timestamp"]);
                result.signature          = data["signature"];
            }
            catch (Exception e)
            {
                LOGGER.WARN($"Parse server out task request failed. \n Error = {e.ToString()} \n Request = {strMsg}");
                return(false);
            }

            string strGetSrc   = result.ToGetParamsString();
            string strHashData = "";

            FKBaseUtils.FKHash.GetHash(strGetSrc, ref strHashData);
            string strCSharpPublicKey  = FKBaseUtils.FKRSAEncrypt.ConvertRSAPublicKey_Java2DotNet(strRSAPublicKey);
            bool   bCheckSignSuccessed = FKBaseUtils.FKRSASignature.IsValidRSASign(strCSharpPublicKey, strHashData, result.signature);

            if (!bCheckSignSuccessed)
            {
                LOGGER.WARN($"Server out task request signature check failed.");
                return(false);
            }
            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 解析一个出账请求消息,组装得到一个内部出账任务结构
        /// </summary>
        /// <param name="strRequestString"></param>
        /// <param name="strCSharpPrivateKey"></param>
        /// <returns></returns>
        private static SOutTaskInfo ParseStructFromRequest(string strRequestString, string strCSharpPrivateKey)
        {
            JavaScriptSerializer      js     = new JavaScriptSerializer();
            S2CMessage_OutTaskRequest result = new S2CMessage_OutTaskRequest();
            dynamic data;

            try
            {
                data = js.Deserialize <dynamic>(strRequestString);   // 反序列化
            }
            catch (Exception e)
            {
                LOGGER.WARN($"Server out task request is not a invalid JSON format. \n Error = {e.ToString()} \n Request = {strRequestString}");
                return(result.info);
            }

            string strLoginPassword = "";
            string strTradePassword = "";

            try
            {
                result.info.taskID       = int.Parse(data["taskID"]);
                result.info.nodeID       = int.Parse(data["nodeID"]);
                result.info.fromBankCode = data["fromBankCode"];
                result.info.fromBankName = data["fromBankName"];
                result.info.fromAccount  = data["fromAccount"];
                strLoginPassword         = data["password"];
                strTradePassword         = data["tradePassword"];
                result.info.toBankCode   = data["toBankCode"];
                result.info.toBankName   = data["toBankName"];
                result.info.toAccount    = data["toAccount"];
                result.info.holderName   = data["holderName"];
                result.info.amount       = data["amount"];
                result.info.remarks      = data["remarks"];
            }
            catch (Exception e)
            {
                LOGGER.WARN($"Parse server out task request failed. \n Error = {e.ToString()} \n Request = {strRequestString}");
                result.info.taskID = 0;     // 注意清零,外面靠该值判断是否解析成功的
                return(result.info);
            }

            try
            {
                // 根据约定进行RSA解密密码
                string xmlKey = FKBaseUtils.FKRSAEncrypt.ConvertRSAPrivateKey_Java2DotNet(strCSharpPrivateKey);
                result.info.password = FKBaseUtils.FKRSAEncrypt.RSADecryptByDotNetPrivateKey(strLoginPassword, xmlKey);
                if (string.IsNullOrEmpty(result.info.password))
                {
                    LOGGER.WARN($"Decrypt password failed. Password = {strLoginPassword}");
                    result.info.taskID = 0;
                    return(result.info);
                }
                result.info.tradePassword = FKBaseUtils.FKRSAEncrypt.RSADecryptByDotNetPrivateKey(strTradePassword, xmlKey);
                if (string.IsNullOrEmpty(result.info.tradePassword))
                {
                    LOGGER.WARN($"Decrypt trade password failed. Password = {strTradePassword}");
                    result.info.taskID = 0;
                    return(result.info);
                }
            }
            catch (Exception e)
            {
                LOGGER.WARN($"Decrypt passwords failed. \n Error = {e.ToString()} \n Request = {strRequestString}");
                result.info.taskID = 0;
                return(result.info);
            }

            // 一切正常
            return(result.info);
        }