二進制數據的序列化反序列化和Json的序列化反序列化的重要區別 <> 【1】Asp.Net Core2.2從環境配置到應用創建 加密解密幫助類 WebApi FromBody參

二進制數據的序列化反序列化和Json的序列化反序列化的重要區別

  前言:最近一個一個很奇怪的問題,很明白的說,就是沒看懂,參照下面的代碼:html

 

複製代碼
 /// <summary>
        /// 反序列化對象
        /// </summary>
        /// <typeparam name="T">指定對象類型</typeparam>
        /// <param name="data">字節數組</param>
        /// <param name="isClearData">壓縮完成後,是否清除待壓縮字節數組裏面的內容</param>
        /// <returns>指定類型的對象</returns>
        public static T DeserializeByBytes<T>(byte[] data, bool isClearData = true)
        {
            T t = default(T);
            if (data == null)
                return t;
            try
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream ms = new MemoryStream(data))
                {
                    t = (T)formatter.Deserialize(ms);
                }
                formatter = null;
                if (isClearData)
                    Array.Clear(data, 0, data.Length);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return t;
        }

        [Serializable]
        public class parent
        {
            public string a;

        }
        [Serializable]
        public class children : parent
        {
            public string b;
        }

        public static DeserializeBytes(byte[] byteData)
        {
            //byteData數據,實際上是:{ a = "1", b = "2" } 也就是children對象獲得的二進制數據流

            parent a = Program.DeserializeByBytes<parent>(byteData);

            children b = a as children;

            Console.WriteLine(JsonConvert.SerializeObject(b));

        }
複製代碼

  猜猜結果是什麼?程序員

  

 

  很奇怪?是否是,我是先反序列化成的父對象:parent對象,parent對象裏沒有屬性b,可是我將父對象AS成子對象時,子對象children的屬性b中竟然有值,是否是很神奇!!!ajax

  一樣的狀況,咱們使用JsonConvert的序列化和反序列化作一遍,結果以下:算法

  

複製代碼
var cc = new children { a = "1", b = "2" };

            var ccStr = JsonConvert.SerializeObject(cc);

            parent p = JsonConvert.DeserializeObject<parent>(ccStr);
            Console.WriteLine(JsonConvert.SerializeObject(p));
            children c = p as children;
            Console.WriteLine(JsonConvert.SerializeObject(c));

            Console.Read();
複製代碼

 

  是否是很奇怪?  妹的,真是神奇了,最後詢問咱們的老大才知道,劃重點了哈:json

 

  重點:經過二級制流序列化和反序列化的對象呢,屬性值並不會丟失!!! 而經過JsonConvert進行的string類型的序列化反序列化,多餘的屬性值會丟失!!!     就是真麼神奇!跨域

  本人以爲,應該是和機制有關,經過二進制轉換的數據,多餘的數據計算機會始終記錄着,畢竟計算機自己就是二進制的。而經過JsonConvert的方式,它會默認去匹配屬性去,沒有匹配上的屬性會直接丟失。   數組

 

 

 

指針很簡單瀏覽器

  ------引子安全

      學計算機語言,首先推薦C語言.不管是數據結構仍是算法,站在C語言的角度,會讓咱們理解的更加清晰透徹.服務器

    可是,指針不太"友好",讓不少人抓狂,頭疼.很多人選擇了放棄,繞行.百度上有千千萬個解決方法,而咱們放棄的理

    由和簡單,路在腳下,向前還?是向後?

      C語言之因此經久不衰,就是由於指針的存在.本篇將幫助你們突破指針這個瓶頸.

    

    1.指針和指針變量(一般咱們敘述時會把指針變量簡稱爲指針,實際他們含義並不同)

      指針:0x7ffe38fea3e0

      指針變量:char *data;(*data就是指針變量)

    2.指針和函數的關係(給子函數傳多個值時用到(注意:你要不知道給什麼,請自覺抄寫關於指針案例,10遍))

      須要提早掌握:函數的設計(返回值  函數名 參數),不清楚,請問百度;

             子函數能不能靜態申請空間,動態呢?會出現啥狀況?

             子函數何時是指針?

              函數能夠返回地址碼?

      此時此刻,熱心網友早已經爲咱們準備好了,咱們耐心的去博客園/csdn找,絕對能夠找到,講的很是專業.

    3.指針與字符串

       這個也百度,固然我不是糟老頭啊.對於很對新人來講,缺乏的是獨自探索能力,遇到問題先去文別人,不懂的地方都是,這個老師沒講,那個書本沒有,對於程序員而言,咱們須要本身想辦法.若是一直依靠問別人,是遠遠不夠的.

    4.指針數組、二級指針、函數指針、指針函數、二維數組、void  *

        指針數組:是一個數組,每一項都是指針(處理多個字符串)

          案例:char *str[5] = {NULL};

        二級指針:

            int data = 0;

            int *p = NULL;

            p = &data;  <-------(這是二級指針)

            int **q = NULL; <------(這也是二級指針)

            指針數組也是(不知道,不知道百度回爐數組去)

        函數指針:

            回調函數是啥?

            函數如何做爲另外一個函數的參數,有啥案例?

            本身百度!

        指針函數:(函數參數返回值是指針的函數)

        

        二維數組: char[2][3]data;(有2個空間,每一個空間大小爲3)

 

        void *:「不肯定類型指針

          http://www.javashuo.com/article/p-gvttdmxb-ey.html本身去看

            

  當咱們接觸到新的知識時,反覆的查找,總結練習,才能達突破某一瓶頸,抵達下一個佳境,C語言的開發速度很難跟上社會需求的速度,前人爲咱們已經整理好了不少寶貴的心得.可是探索精神須要稀缺,仍是那句話,不會百度想辦法,當你工做幾年後你會感謝曾今的本身,知識、機會向來都是本身去找的.

  多百度,多和同事交流,多看書,多總結,成功都是在這些廢話中.

 

什麼是研究
research
就是re -search
不一樣的尋找搜索
這就是研究,由於咱們在探索未知區域
咱們只能搜索

 

 

 

 

【1】Asp.Net Core2.2從環境配置到應用創建

 

做者:Eleven

來源:公衆號【軟謀net】

 

【前言】

.Net Core開源&跨平臺,已經肉眼可見將成爲.Net平臺的將來,在企業招聘需求上已經頻頻見到,接觸到不少公司內部都已經開始嘗試Core的項目了,尤爲是騰訊的財付通所有是基於Core+微服務搭建的,讓人倍感振奮!Eleven最近出個專題,以當下最新的Asp.Net Core 2.2 Preview3爲版本,給你們來一套系統教程,但願小夥伴兒們能多多關注!

 

【環境搭建】

我這邊使用的VisualStudio版本爲2017企業版15.7.4(並非最新版本,專業版社區版也都是能夠的)。以前安裝是自帶的Core是1.1版本,如今須要安裝最新的sdk(dotnet-sdk-2.2.100-preview3-009430-win-x64.exe),以及最新的runtime(dotnet-runtime-2.2.0-preview3-27014-02-win-x64)。相關環境配置,須要的話能夠關注底部公衆號後,聯繫助教老師獲取!

【項目創建】

下面開始動手創建Asp.Net Core2.2項目了,添加項目,選擇Web,而後選擇 ASP.NET Core Web應用程序模板,另外那個是原來的Framework版本的。

這裏選擇.NET Core,而後選擇最新的ASP.NET Core2.2,選擇下面的MVC應用程序,點擊肯定便可完成建立!創建完後的項目以下,一個典型的MVC項目,可是跟Framework下的有明顯差別,增長了Program和Startup,這二位將是本文的主角了!

 

 
【Program】

看到Program,應該有種很親切的感受,包括裏面的Main方法,這就是整個程序的入口。實際上,咱們創建的這個項目,本質就是個控制檯程序而已,查看項目屬性能夠得知。但爲啥這個Program能當成MVC網站呢?

祕密就是那個CreateDefaultBuilder方法,這裏面是啓動一個Kestrel的服務器來完成請求的監聽和響應的,在之前Core版本里,這裏還有不少的配置項,如今已經內置爲一個Default了。而後這裏簡單理解下,就是初始化一個服務器,而後Run一下,咱們的Web服務器就算是啓動了。其中在初始化服務器的時候,使用了一個Startup類,下面來詳析一番!

 

【Startup】

 

在 ASP.NET Core 中,Startup 類提供了應用程序的入口,並且在全部應用程序中都有 Startup 類。ASP.NET 會在主程序集中搜索名爲 Startup 的類(在任何命名空間下)。ASP.NET 並不關心 Startup 類是否是定義爲 public,若是它符合命名規範,ASP.NET 將繼續加載它。若是有多個 Startup 類,也不會觸發異常,ASP.NET 將基於命名空間選擇其中一個(匹配項目的根命名空間優先,不然使用第一個按字母排列的命名空間中的類)。

 

打開Startup類,大概分三塊,這個是典型的構造函數注入,完成了一個叫IConfiguration類型變量的注入,至因而怎麼注入的,後文中會講到。這個變量是用來讀取配置文件的,跟之前Framework下那個System.ConfigurationManager類差很少的。

 

 而後是ConfigureServices方法,上面的註釋描述的很清楚,是交給運行時環境調用的方法,而後用來給容器註冊服務的(跟剛纔說到的注入一致)。在Asp.Net Core裏面,IOC容器是直接內置了的,也就是這個IServiceCollection。感興趣的小夥伴兒能夠去嘗試下,直接nuget就能夠下載Microsoft.Extensions.DependencyInjection,跟常見的容器用法幾乎同樣的,後面單獨開文章再講這個。這裏完成所有須要依賴注入對象的初始化。

最下面是Configure方法,也是由運行時環境調用的,用來配置HTTP請求的處理管道的。Web的本質就是對Http請求的處理,最終獲得一個響應結果,而這個方法,清晰的描述了,該如何去處理請求。 


【內置服務和啓動】

下面我就能夠啓動網站了,之前在作網站開發測試的時候,習慣性的去指定一下網站的端口和默認頁,可是如今項目類型是控制檯項目,相關的配置如今轉移到項目的Properties--->launchSettings.json文件裏面,能夠在這裏修改生效!順便說一下,由於創建項目的時候,勾選了SSL支持,那麼這裏啓動的會是https的Url,並且這個sslPort好像只能是以443開頭,不然可能會沒法訪問。

而後一個徹底沒有作任何修改的Asp.Net Core2.2的項目就運行起來啦!

 

 

 

 

加密解密幫助類

 

簡單說一下加密解密:

加密解密有挺多方式去實現,今天呢我作爲宇宙第一帥的人就給你們來分享如下源代碼!聽清楚是源代碼哦!!

 

 

 

話很少說上乾貨

1:MD5加密/解密

複製代碼
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Web;
 5 using System.Text.RegularExpressions;
 6 
 7 namespace hic.Common
 8 {
 9    public class SecurityHelper
10     {
11         /// <summary>
12         /// MD5字符串加密
13         /// </summary>
14         /// <param name="source">待加密字符串</param>
15         /// <returns></returns>
16         public static string MD5(string source)
17         {
18             return MD5(source, true);
19         }
20 
21         /// <summary>
22         /// MD5字符串加密
23         /// </summary>
24         /// <param name="source">待加密字符串</param>
25         /// <param name="ishalf">加密是16位仍是32位,若是爲true則是16位。</param>
26         /// <returns></returns>
27         public static string MD5(string source, bool ishalf)
28         {
29             string outputStr = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5").ToLower();
30             if (ishalf)//16位MD5加密(取32位加密的9~25字符)
31                 outputStr = outputStr.Substring(8, 16);
32             return outputStr;
33         }
34 
35         /// <summary>
36         /// 對字符串進行Base64編碼
37         /// </summary>
38         /// <param name="source">待編碼字符串</param>
39         /// <returns></returns>
40         public static string EncodeBase64(string source)
41         {
42             UnicodeEncoding code = new UnicodeEncoding();
43             byte[] bytes = code.GetBytes(source);
44             return Convert.ToBase64String(bytes);
45         }
46 
47         /// <summary>
48         /// 對字符串進行Base64解碼
49         /// </summary>
50         /// <param name="source">待解碼字符串</param>
51         /// <returns></returns>
52         public static string DecodeBase64(string source)
53         {
54             UnicodeEncoding code = new UnicodeEncoding();
55             byte[] bytes = Convert.FromBase64String(source);
56             return code.GetString(bytes);
57         }
58 
59         /// <summary>
60         /// 檢查當前IP是不是受限IP
61         /// </summary>
62         /// <param name="LimitedIP">受限的IP,格式如:192.168.1.110|212.235.*.*|232.*.*.*</param>
63         /// <returns>返回true表示IP未受到限制</returns>
64         public static bool CheckIPIsLimited(string limitedIP)
65         {
66             string currentIP = GetUserIP();
67             if (limitedIP == null || limitedIP.Trim() == string.Empty)
68                 return true;
69             limitedIP.Replace(".", @"\.");
70             limitedIP.Replace("*", @"[^\.]{1,3}");
71             Regex reg = new Regex(limitedIP, RegexOptions.Compiled);
72             Match match = reg.Match(currentIP);
73             return !match.Success;
74         }
75 
76         /// <summary>
77         /// 獲得用戶IP
78         /// </summary>
79         /// <returns></returns>
80         public static string GetUserIP()
81         {
82             return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
83         }
84     }
85 }
複製代碼

2:DES加密/解密類

複製代碼
 1 using System;
 2 using System.Security.Cryptography;  
 3 using System.Text;
 4 namespace Maticsoft.Common.DEncrypt
 5 {
 6     /// <summary>
 7     /// DES加密/解密類。
 8     /// LiTianPing
 9     /// </summary>
10     public class DESEncrypt
11     {
12         public DESEncrypt()
13         {            
14         }
15 
16         #region ========加密======== 
17  
18         /// <summary>
19         /// 加密
20         /// </summary>
21         /// <param name="Text"></param>
22         /// <returns></returns>
23         public static string Encrypt(string Text) 
24         {
25             return Encrypt(Text,"MATICSOFT");
26         }
27         /// <summary> 
28         /// 加密數據 
29         /// </summary> 
30         /// <param name="Text"></param> 
31         /// <param name="sKey"></param> 
32         /// <returns></returns> 
33         public static string Encrypt(string Text,string sKey) 
34         { 
35             DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
36             byte[] inputByteArray; 
37             inputByteArray=Encoding.Default.GetBytes(Text); 
38             des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
39             des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
40             System.IO.MemoryStream ms=new System.IO.MemoryStream(); 
41             CryptoStream cs=new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write); 
42             cs.Write(inputByteArray,0,inputByteArray.Length); 
43             cs.FlushFinalBlock(); 
44             StringBuilder ret=new StringBuilder(); 
45             foreach( byte b in ms.ToArray()) 
46             { 
47                 ret.AppendFormat("{0:X2}",b); 
48             } 
49             return ret.ToString(); 
50         } 
51 
52         #endregion
53         
54         #region ========解密======== 
55    
56  
57         /// <summary>
58         /// 解密
59         /// </summary>
60         /// <param name="Text"></param>
61         /// <returns></returns>
62         public static string Decrypt(string Text) 
63         {
64             return Decrypt(Text,"MATICSOFT");
65         }
66         /// <summary> 
67         /// 解密數據 
68         /// </summary> 
69         /// <param name="Text"></param> 
70         /// <param name="sKey"></param> 
71         /// <returns></returns> 
72         public static string Decrypt(string Text,string sKey) 
73         { 
74             DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
75             int len; 
76             len=Text.Length/2; 
77             byte[] inputByteArray = new byte[len]; 
78             int x,i; 
79             for(x=0;x<len;x++) 
80             { 
81                 i = Convert.ToInt32(Text.Substring(x * 2, 2), 16); 
82                 inputByteArray[x]=(byte)i; 
83             } 
84             des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
85             des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
86             System.IO.MemoryStream ms=new System.IO.MemoryStream(); 
87             CryptoStream cs=new CryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write); 
88             cs.Write(inputByteArray,0,inputByteArray.Length); 
89             cs.FlushFinalBlock(); 
90             return Encoding.Default.GetString(ms.ToArray()); 
91         } 
92  
93         #endregion 
94 
95 
96     }
97 }
複製代碼

3:RSA加密解密及RSA簽名和驗證

複製代碼
  1 using System; 
  2 using System.Text; 
  3 using System.Security.Cryptography; 
  4 namespace Maticsoft.Common.DEncrypt
  5 { 
  6     /// <summary> 
  7     /// RSA加密解密及RSA簽名和驗證
  8     /// </summary> 
  9     public class RSACryption 
 10     {         
 11         public RSACryption() 
 12         {             
 13         } 
 14         
 15 
 16         #region RSA 加密解密 
 17 
 18         #region RSA 的密鑰產生 
 19     
 20         /// <summary>
 21         /// RSA 的密鑰產生 產生私鑰 和公鑰 
 22         /// </summary>
 23         /// <param name="xmlKeys"></param>
 24         /// <param name="xmlPublicKey"></param>
 25         public void RSAKey(out string xmlKeys,out string xmlPublicKey) 
 26         {             
 27                 System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
 28                 xmlKeys=rsa.ToXmlString(true); 
 29                 xmlPublicKey = rsa.ToXmlString(false);             
 30         } 
 31         #endregion 
 32 
 33         #region RSA的加密函數 
 34         //############################################################################## 
 35         //RSA 方式加密 
 36         //說明KEY必須是XML的行式,返回的是字符串 
 37         //在有一點須要說明!!該加密方式有 長度 限制的!! 
 38         //############################################################################## 
 39 
 40         //RSA的加密函數  string
 41         public string RSAEncrypt(string xmlPublicKey,string m_strEncryptString ) 
 42         { 
 43             
 44             byte[] PlainTextBArray; 
 45             byte[] CypherTextBArray; 
 46             string Result; 
 47             RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
 48             rsa.FromXmlString(xmlPublicKey); 
 49             PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString); 
 50             CypherTextBArray = rsa.Encrypt(PlainTextBArray, false); 
 51             Result=Convert.ToBase64String(CypherTextBArray); 
 52             return Result; 
 53             
 54         } 
 55         //RSA的加密函數 byte[]
 56         public string RSAEncrypt(string xmlPublicKey,byte[] EncryptString ) 
 57         { 
 58             
 59             byte[] CypherTextBArray; 
 60             string Result; 
 61             RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
 62             rsa.FromXmlString(xmlPublicKey); 
 63             CypherTextBArray = rsa.Encrypt(EncryptString, false); 
 64             Result=Convert.ToBase64String(CypherTextBArray); 
 65             return Result; 
 66             
 67         } 
 68         #endregion 
 69 
 70         #region RSA的解密函數 
 71         //RSA的解密函數  string
 72         public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString ) 
 73         {            
 74             byte[] PlainTextBArray; 
 75             byte[] DypherTextBArray; 
 76             string Result; 
 77             System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
 78             rsa.FromXmlString(xmlPrivateKey); 
 79             PlainTextBArray =Convert.FromBase64String(m_strDecryptString); 
 80             DypherTextBArray=rsa.Decrypt(PlainTextBArray, false); 
 81             Result=(new UnicodeEncoding()).GetString(DypherTextBArray); 
 82             return Result; 
 83             
 84         } 
 85 
 86         //RSA的解密函數  byte
 87         public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString ) 
 88         {            
 89             byte[] DypherTextBArray; 
 90             string Result; 
 91             System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
 92             rsa.FromXmlString(xmlPrivateKey); 
 93             DypherTextBArray=rsa.Decrypt(DecryptString, false); 
 94             Result=(new UnicodeEncoding()).GetString(DypherTextBArray); 
 95             return Result; 
 96             
 97         } 
 98         #endregion 
 99 
100         #endregion 
101 
102         #region RSA數字簽名 
103 
104         #region 獲取Hash描述表 
105         //獲取Hash描述表 
106         public bool GetHash(string m_strSource, ref byte[] HashData) 
107         {             
108             //從字符串中取得Hash描述 
109             byte[] Buffer; 
110             System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5"); 
111             Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource); 
112             HashData = MD5.ComputeHash(Buffer); 
113 
114             return true;             
115         } 
116 
117         //獲取Hash描述表 
118         public bool GetHash(string m_strSource, ref string strHashData) 
119         { 
120             
121             //從字符串中取得Hash描述 
122             byte[] Buffer; 
123             byte[] HashData; 
124             System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5"); 
125             Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource); 
126             HashData = MD5.ComputeHash(Buffer); 
127 
128             strHashData = Convert.ToBase64String(HashData); 
129             return true; 
130             
131         } 
132 
133         //獲取Hash描述表 
134         public bool GetHash(System.IO.FileStream objFile, ref byte[] HashData) 
135         { 
136             
137             //從文件中取得Hash描述 
138             System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5"); 
139             HashData = MD5.ComputeHash(objFile); 
140             objFile.Close(); 
141 
142             return true; 
143             
144         } 
145 
146         //獲取Hash描述表 
147         public bool GetHash(System.IO.FileStream objFile, ref string strHashData) 
148         { 
149             
150             //從文件中取得Hash描述 
151             byte[] HashData; 
152             System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5"); 
153             HashData = MD5.ComputeHash(objFile); 
154             objFile.Close(); 
155 
156             strHashData = Convert.ToBase64String(HashData); 
157 
158             return true; 
159             
160         } 
161         #endregion 
162 
163         #region RSA簽名 
164         //RSA簽名 
165         public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref byte[] EncryptedSignatureData) 
166         { 
167             
168                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
169 
170                 RSA.FromXmlString(p_strKeyPrivate); 
171                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA); 
172                 //設置簽名的算法爲MD5 
173                 RSAFormatter.SetHashAlgorithm("MD5"); 
174                 //執行簽名 
175                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature); 
176 
177                 return true; 
178             
179         } 
180 
181         //RSA簽名 
182         public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref string m_strEncryptedSignatureData) 
183         { 
184             
185                 byte[] EncryptedSignatureData; 
186 
187                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
188 
189                 RSA.FromXmlString(p_strKeyPrivate); 
190                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA); 
191                 //設置簽名的算法爲MD5 
192                 RSAFormatter.SetHashAlgorithm("MD5"); 
193                 //執行簽名 
194                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature); 
195 
196                 m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData); 
197 
198                 return true; 
199             
200         } 
201 
202         //RSA簽名 
203         public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref byte[] EncryptedSignatureData) 
204         { 
205             
206                 byte[] HashbyteSignature; 
207 
208                 HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature); 
209                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
210 
211                 RSA.FromXmlString(p_strKeyPrivate); 
212                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA); 
213                 //設置簽名的算法爲MD5 
214                 RSAFormatter.SetHashAlgorithm("MD5"); 
215                 //執行簽名 
216                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature); 
217 
218                 return true; 
219             
220         } 
221 
222         //RSA簽名 
223         public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref string m_strEncryptedSignatureData) 
224         { 
225             
226                 byte[] HashbyteSignature; 
227                 byte[] EncryptedSignatureData; 
228 
229                 HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature); 
230                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
231 
232                 RSA.FromXmlString(p_strKeyPrivate); 
233                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA); 
234                 //設置簽名的算法爲MD5 
235                 RSAFormatter.SetHashAlgorithm("MD5"); 
236                 //執行簽名 
237                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature); 
238 
239                 m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData); 
240 
241                 return true; 
242             
243         } 
244         #endregion 
245 
246         #region RSA 簽名驗證 
247 
248         public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, byte[] DeformatterData) 
249         { 
250             
251                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
252 
253                 RSA.FromXmlString(p_strKeyPublic); 
254                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA); 
255                 //指定解密的時候HASH算法爲MD5 
256                 RSADeformatter.SetHashAlgorithm("MD5"); 
257 
258                 if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData)) 
259                 { 
260                     return true; 
261                 } 
262                 else 
263                 { 
264                     return false; 
265                 } 
266             
267         } 
268 
269         public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, byte[] DeformatterData) 
270         { 
271             
272                 byte[] HashbyteDeformatter; 
273 
274                 HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter); 
275 
276                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
277 
278                 RSA.FromXmlString(p_strKeyPublic); 
279                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA); 
280                 //指定解密的時候HASH算法爲MD5 
281                 RSADeformatter.SetHashAlgorithm("MD5"); 
282 
283                 if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData)) 
284                 { 
285                     return true; 
286                 } 
287                 else 
288                 { 
289                     return false; 
290                 } 
291             
292         } 
293 
294         public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, string p_strDeformatterData) 
295         { 
296             
297                 byte[] DeformatterData; 
298 
299                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
300 
301                 RSA.FromXmlString(p_strKeyPublic); 
302                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA); 
303                 //指定解密的時候HASH算法爲MD5 
304                 RSADeformatter.SetHashAlgorithm("MD5"); 
305 
306                 DeformatterData =Convert.FromBase64String(p_strDeformatterData); 
307 
308                 if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData)) 
309                 { 
310                     return true; 
311                 } 
312                 else 
313                 { 
314                     return false; 
315                 } 
316             
317         } 
318 
319         public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData) 
320         { 
321             
322                 byte[] DeformatterData; 
323                 byte[] HashbyteDeformatter; 
324 
325                 HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter); 
326                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); 
327 
328                 RSA.FromXmlString(p_strKeyPublic); 
329                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA); 
330                 //指定解密的時候HASH算法爲MD5 
331                 RSADeformatter.SetHashAlgorithm("MD5"); 
332 
333                 DeformatterData =Convert.FromBase64String(p_strDeformatterData); 
334 
335                 if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData)) 
336                 { 
337                     return true; 
338                 } 
339                 else 
340                 { 
341                     return false; 
342                 } 
343             
344         } 
345 
346 
347         #endregion 
348 
349 
350         #endregion 
351 
352     } 
353 } 
複製代碼

4:哈希加密/解密

複製代碼
 1 using System;
 2 using System.Text;
 3 using System.Security.Cryptography;
 4 namespace Maticsoft.Common.DEncrypt
 5 {
 6     /// <summary>
 7     /// 獲得隨機安全碼(哈希加密)。
 8     /// </summary>
 9     public class HashEncode
10     {
11         public HashEncode()
12         {
13             //
14             // TODO: 在此處添加構造函數邏輯
15             //
16         }
17         /// <summary>
18         /// 獲得隨機哈希加密字符串
19         /// </summary>
20         /// <returns></returns>
21         public static string GetSecurity()
22         {            
23             string Security = HashEncoding(GetRandomValue());        
24             return Security;
25         }
26         /// <summary>
27         /// 獲得一個隨機數值
28         /// </summary>
29         /// <returns></returns>
30         public static string GetRandomValue()
31         {            
32             Random Seed = new Random();
33             string RandomVaule = Seed.Next(1, int.MaxValue).ToString();
34             return RandomVaule;
35         }
36         /// <summary>
37         /// 哈希加密一個字符串
38         /// </summary>
39         /// <param name="Security"></param>
40         /// <returns></returns>
41         public static string HashEncoding(string Security)
42         {                        
43             byte[] Value;
44             UnicodeEncoding Code = new UnicodeEncoding();
45             byte[] Message = Code.GetBytes(Security);
46             SHA512Managed Arithmetic = new SHA512Managed();
47             Value = Arithmetic.ComputeHash(Message);
48             Security = "";
49             foreach(byte o in Value)
50             {
51                 Security += (int) o + "O";
52             }
53             return Security;
54         }
55     }
56 }
複製代碼

5:Encrypt

複製代碼
  1 using System;
  2 using System.Security.Cryptography;  
  3 using System.Text;
  4 namespace Maticsoft.Common.DEncrypt
  5 {
  6     /// <summary>
  7     /// Encrypt 的摘要說明。
  8     /// LiTianPing
  9     /// </summary>
 10     public class DEncrypt
 11     {
 12         /// <summary>
 13         /// 構造方法
 14         /// </summary>
 15         public DEncrypt()  
 16         {  
 17         } 
 18 
 19         #region 使用 缺省密鑰字符串 加密/解密string
 20 
 21         /// <summary>
 22         /// 使用缺省密鑰字符串加密string
 23         /// </summary>
 24         /// <param name="original">明文</param>
 25         /// <returns>密文</returns>
 26         public static string Encrypt(string original)
 27         {
 28             return Encrypt(original,"MATICSOFT");
 29         }
 30         /// <summary>
 31         /// 使用缺省密鑰字符串解密string
 32         /// </summary>
 33         /// <param name="original">密文</param>
 34         /// <returns>明文</returns>
 35         public static string Decrypt(string original)
 36         {
 37             return Decrypt(original,"MATICSOFT",System.Text.Encoding.Default);
 38         }
 39 
 40         #endregion
 41 
 42         #region 使用 給定密鑰字符串 加密/解密string
 43         /// <summary>
 44         /// 使用給定密鑰字符串加密string
 45         /// </summary>
 46         /// <param name="original">原始文字</param>
 47         /// <param name="key">密鑰</param>
 48         /// <param name="encoding">字符編碼方案</param>
 49         /// <returns>密文</returns>
 50         public static string Encrypt(string original, string key)  
 51         {  
 52             byte[] buff = System.Text.Encoding.Default.GetBytes(original);  
 53             byte[] kb = System.Text.Encoding.Default.GetBytes(key);
 54             return Convert.ToBase64String(Encrypt(buff,kb));      
 55         }
 56         /// <summary>
 57         /// 使用給定密鑰字符串解密string
 58         /// </summary>
 59         /// <param name="original">密文</param>
 60         /// <param name="key">密鑰</param>
 61         /// <returns>明文</returns>
 62         public static string Decrypt(string original, string key)
 63         {
 64             return Decrypt(original,key,System.Text.Encoding.Default);
 65         }
 66 
 67         /// <summary>
 68         /// 使用給定密鑰字符串解密string,返回指定編碼方式明文
 69         /// </summary>
 70         /// <param name="encrypted">密文</param>
 71         /// <param name="key">密鑰</param>
 72         /// <param name="encoding">字符編碼方案</param>
 73         /// <returns>明文</returns>
 74         public static string Decrypt(string encrypted, string key,Encoding encoding)  
 75         {       
 76             byte[] buff = Convert.FromBase64String(encrypted);  
 77             byte[] kb = System.Text.Encoding.Default.GetBytes(key);
 78             return encoding.GetString(Decrypt(buff,kb));      
 79         }  
 80         #endregion
 81 
 82         #region 使用 缺省密鑰字符串 加密/解密/byte[]
 83         /// <summary>
 84         /// 使用缺省密鑰字符串解密byte[]
 85         /// </summary>
 86         /// <param name="encrypted">密文</param>
 87         /// <param name="key">密鑰</param>
 88         /// <returns>明文</returns>
 89         public static byte[] Decrypt(byte[] encrypted)  
 90         {  
 91             byte[] key = System.Text.Encoding.Default.GetBytes("MATICSOFT"); 
 92             return Decrypt(encrypted,key);     
 93         }
 94         /// <summary>
 95         /// 使用缺省密鑰字符串加密
 96         /// </summary>
 97         /// <param name="original">原始數據</param>
 98         /// <param name="key">密鑰</param>
 99         /// <returns>密文</returns>
100         public static byte[] Encrypt(byte[] original)  
101         {  
102             byte[] key = System.Text.Encoding.Default.GetBytes("MATICSOFT"); 
103             return Encrypt(original,key);     
104         }  
105         #endregion
106 
107         #region  使用 給定密鑰 加密/解密/byte[]
108 
109         /// <summary>
110         /// 生成MD5摘要
111         /// </summary>
112         /// <param name="original">數據源</param>
113         /// <returns>摘要</returns>
114         public static byte[] MakeMD5(byte[] original)
115         {
116             MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();   
117             byte[] keyhash = hashmd5.ComputeHash(original);       
118             hashmd5 = null;  
119             return keyhash;
120         }
121 
122 
123         /// <summary>
124         /// 使用給定密鑰加密
125         /// </summary>
126         /// <param name="original">明文</param>
127         /// <param name="key">密鑰</param>
128         /// <returns>密文</returns>
129         public static byte[] Encrypt(byte[] original, byte[] key)  
130         {  
131             TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();       
132             des.Key =  MakeMD5(key);
133             des.Mode = CipherMode.ECB;  
134      
135             return des.CreateEncryptor().TransformFinalBlock(original, 0, original.Length);     
136         }  
137 
138         /// <summary>
139         /// 使用給定密鑰解密數據
140         /// </summary>
141         /// <param name="encrypted">密文</param>
142         /// <param name="key">密鑰</param>
143         /// <returns>明文</returns>
144         public static byte[] Decrypt(byte[] encrypted, byte[] key)  
145         {  
146             TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();  
147             des.Key =  MakeMD5(key);    
148             des.Mode = CipherMode.ECB;  
149 
150             return des.CreateDecryptor().TransformFinalBlock(encrypted, 0, encrypted.Length);
151         }  
152   
153         #endregion
154 
155         
156 
157         
158     }
159 }
複製代碼

 

 

 

 

WebApi程序可在方法參數前加[FromBody]標識,表示該參數值應該從請求的Body中獲取,而不是從URL中獲取。

從URL獲取參數值的方式的弊端是URL有長度限制,當超過瀏覽器的最大URL長度時請求將被瀏覽器拒絕,根本不會發出去。

所以,當參數值過大時須要用[FromBody]參數進行傳輸。

 

如下是WebApi接口定義,很簡單,只爲說明用法:

private string SendObjectAsJsonInBody(string url, object objBody)
{
string result;
HttpClient client;
StringContent content;

client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
content = new StringContent(ParkingSqlHelper.JsonHelper.SerializeObject(objBody), Encoding.UTF8, "application/json");
result = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;

return result;
}
protected HttpResponseMessage GetJsonResponse(string json)
{
HttpResponseMessage result;

result = new HttpResponseMessage { Content = new StringContent(json, Encoding.GetEncoding("UTF-8"), "application/json") };
//result.Headers.Add("Access-Control-Allow-Origin", "*"); //設置HTTP頭容許 返回的跨域信息給瀏覽器解析

return result;
}
須要注意的是: [FromBody] 參數不能是基本的數據類型(如byte、int、bool、DateTime、string等)。

如下是C#客戶端請求的代碼

/// <summary>
/// 經過請求體向指定URL傳輸數據
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="objBody">需傳輸的數據</param>
/// <returns></returns>
private string SendObjectAsJsonInBody(string url, object objBody)
{
string result;
HttpClient client;
StringContent content;

client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
content = new StringContent(ParkingSqlHelper.JsonHelper.SerializeObject(objBody), Encoding.UTF8, "application/json");
result = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;

return result;
}

如下是JQuery請求的代碼function Send(url, objBody) { $.ajax({ url: url, type: "post", data: JSON.stringify(objBody), contentType: "application/json; charset=UTF-8", timeout: 5000, success: function (result) { alert("data = " + JSON.stringify(result)); }, error: function (jqXHR, textStatus, errorThrown) { alert(textStatus); } });};---------------------

相關文章
相關標籤/搜索