[C#] 簡單的 Helper 封裝 -- SecurityHelper 安全助手:封裝加密演算法(MD5、SHA、HMAC、DES、RSA)

来源:http://www.cnblogs.com/liqingwen/archive/2016/12/10/6155694.html
-Advertisement-
Play Games

【博主】反骨仔 【出處】http://www.cnblogs.com/liqingwen/p/6155694.html ...


  1 using System;
  2 using System.IO;
  3 using System.Security.Cryptography;
  4 using System.Text;
  5 
  6 namespace Wen.Helpers
  7 {
  8     /// <summary>
  9     /// 安全助手
 10     /// </summary>
 11     public sealed class SecurityHelper
 12     {
 13         private static readonly byte [] IvBytes = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
 14 
 15         #region 通用加密演算法
 16 
 17         /// <summary>
 18         /// 哈希加密演算法
 19         /// </summary>
 20         /// <param name="hashAlgorithm"> 所有加密哈希演算法實現均必須從中派生的基類 </param>
 21         /// <param name="input"> 待加密的字元串 </param>
 22         /// <param name="encoding"> 字元編碼 </param>
 23         /// <returns></returns>
 24         private static string HashEncrypt( HashAlgorithm hashAlgorithm, string input, Encoding encoding)
 25         {
 26             var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input));
 27 
 28             return BitConverter .ToString(data).Replace( "-", "" );
 29         }
 30 
 31         /// <summary>
 32         /// 驗證哈希值
 33         /// </summary>
 34         /// <param name="hashAlgorithm"> 所有加密哈希演算法實現均必須從中派生的基類 </param>
 35         /// <param name="unhashedText"> 未加密的字元串 </param>
 36         /// <param name="hashedText"> 經過加密的哈希值 </param>
 37         /// <param name="encoding"> 字元編碼 </param>
 38         /// <returns></returns>
 39         private static bool VerifyHashValue( HashAlgorithm hashAlgorithm, string unhashedText, string hashedText,
 40             Encoding encoding)
 41         {
 42             return string .Equals(HashEncrypt(hashAlgorithm, unhashedText, encoding), hashedText,
 43                 StringComparison .OrdinalIgnoreCase);
 44         }
 45 
 46         #endregion 通用加密演算法
 47 
 48         #region 哈希加密演算法
 49 
 50         #region MD5 演算法
 51 
 52         /// <summary>
 53         /// MD5 加密
 54         /// </summary>
 55         /// <param name="input"> 待加密的字元串 </param>
 56         /// <param name="encoding"> 字元編碼 </param>
 57         /// <returns></returns>
 58         public static string MD5Encrypt( string input, Encoding encoding)
 59         {
 60             return HashEncrypt(MD5 .Create(), input, encoding);
 61         }
 62 
 63         /// <summary>
 64         /// 驗證 MD5 值
 65         /// </summary>
 66         /// <param name="input"> 未加密的字元串 </param>
 67         /// <param name="encoding"> 字元編碼 </param>
 68         /// <returns></returns>
 69         public static bool VerifyMD5Value( string input, Encoding encoding)
 70         {
 71             return VerifyHashValue(MD5 .Create(), input, MD5Encrypt(input, encoding), encoding);
 72         }
 73 
 74         #endregion MD5 演算法
 75 
 76         #region SHA1 演算法
 77 
 78         /// <summary>
 79         /// SHA1 加密
 80         /// </summary>
 81         /// <param name="input"> 要加密的字元串 </param>
 82         /// <param name="encoding"> 字元編碼 </param>
 83         /// <returns></returns>
 84         public static string SHA1Encrypt( string input, Encoding encoding)
 85         {
 86             return HashEncrypt(SHA1 .Create(), input, encoding);
 87         }
 88 
 89         /// <summary>
 90         /// 驗證 SHA1 值
 91         /// </summary>
 92         /// <param name="input"> 未加密的字元串 </param>
 93         /// <param name="encoding"> 字元編碼 </param>
 94         /// <returns></returns>
 95         public static bool VerifySHA1Value( string input, Encoding encoding)
 96         {
 97             return VerifyHashValue(SHA1 .Create(), input, SHA1Encrypt(input, encoding), encoding);
 98         }
 99 
100         #endregion SHA1 演算法
101 
102         #region SHA256 演算法
103 
104         /// <summary>
105         /// SHA256 加密
106         /// </summary>
107         /// <param name="input"> 要加密的字元串 </param>
108         /// <param name="encoding"> 字元編碼 </param>
109         /// <returns></returns>
110         public static string SHA256Encrypt( string input, Encoding encoding)
111         {
112             return HashEncrypt(SHA256 .Create(), input, encoding);
113         }
114 
115         /// <summary>
116         /// 驗證 SHA256 值
117         /// </summary>
118         /// <param name="input"> 未加密的字元串 </param>
119         /// <param name="encoding"> 字元編碼 </param>
120         /// <returns></returns>
121         public static bool VerifySHA256Value( string input, Encoding encoding)
122         {
123             return VerifyHashValue(SHA256 .Create(), input, SHA256Encrypt(input, encoding), encoding);
124         }
125 
126         #endregion SHA256 演算法
127 
128         #region SHA384 演算法
129 
130         /// <summary>
131         /// SHA384 加密
132         /// </summary>
133         /// <param name="input"> 要加密的字元串 </param>
134         /// <param name="encoding"> 字元編碼 </param>
135         /// <returns></returns>
136         public static string SHA384Encrypt( string input, Encoding encoding)
137         {
138             return HashEncrypt(SHA384 .Create(), input, encoding);
139         }
140 
141         /// <summary>
142         /// 驗證 SHA384 值
143         /// </summary>
144         /// <param name="input"> 未加密的字元串 </param>
145         /// <param name="encoding"> 字元編碼 </param>
146         /// <returns></returns>
147         public static bool VerifySHA384Value( string input, Encoding encoding)
148         {
149             return VerifyHashValue(SHA256 .Create(), input, SHA384Encrypt(input, encoding), encoding);
150         }
151 
152         #endregion SHA384 演算法
153 
154         #region SHA512 演算法
155 
156         /// <summary>
157         /// SHA512 加密
158         /// </summary>
159         /// <param name="input"> 要加密的字元串 </param>
160         /// <param name="encoding"> 字元編碼 </param>
161         /// <returns></returns>
162         public static string SHA512Encrypt( string input, Encoding encoding)
163         {
164             return HashEncrypt(SHA512 .Create(), input, encoding);
165         }
166 
167         /// <summary>
168         /// 驗證 SHA512 值
169         /// </summary>
170         /// <param name="input"> 未加密的字元串 </param>
171         /// <param name="encoding"> 字元編碼 </param>
172         /// <returns></returns>
173         public static bool VerifySHA512Value( string input, Encoding encoding)
174         {
175             return VerifyHashValue(SHA512 .Create(), input, SHA512Encrypt(input, encoding), encoding);
176         }
177 
178         #endregion SHA512 演算法
179 
180         #region HMAC-MD5 加密
181 
182         /// <summary>
183         /// HMAC-MD5 加密
184         /// </summary>
185         /// <param name="input"> 要加密的字元串 </param>
186         /// <param name="key"> 密鑰 </param>
187         /// <param name="encoding"> 字元編碼 </param>
188         /// <returns></returns>
189         public static string HMACSMD5Encrypt( string input, string key, Encoding encoding)
190         {
191             return HashEncrypt(new HMACMD5 (encoding.GetBytes(key)), input, encoding);
192         }
193 
194         #endregion HMAC-MD5 加密
195 
196         #region HMAC-SHA1 加密
197 
198         /// <summary>
199         /// HMAC-SHA1 加密
200         /// </summary>
201         /// <param name="input"> 要加密的字元串 </param>
202         /// <param name="key"> 密鑰 </param>
203         /// <param name="encoding"> 字元編碼 </param>
204         /// <returns></returns>
205         public static string HMACSHA1Encrypt( string input, string key, Encoding encoding)
206         {
207             return HashEncrypt(new HMACSHA1 (encoding.GetBytes(key)), input, encoding);
208         }
209 
210         #endregion HMAC-SHA1 加密
211 
212         #region HMAC-SHA256 加密
213 
214         /// <summary>
215         /// HMAC-SHA256 加密
216         /// </summary>
217         /// <param name="input"> 要加密的字元串 </param>
218         /// <param name="key"> 密鑰 </param>
219         /// <param name="encoding"> 字元編碼 </param>
220         /// <returns></returns>
221         public static string HMACSHA256Encrypt( string input, string key, Encoding encoding)
222         {
223             return HashEncrypt(new HMACSHA256 (encoding.GetBytes(key)), input, encoding);
224         }
225 
226         #endregion HMAC-SHA256 加密
227 
228         #region HMAC-SHA384 加密
229 
230         /// <summary>
231         /// HMAC-SHA384 加密
232         /// </summary>
233         /// <param name="input"> 要加密的字元串 </param>
234         /// <param name="key"> 密鑰 </param>
235         /// <param name="encoding"> 字元編碼 </param>
236         /// <returns></returns>
237         public static string HMACSHA384Encrypt( string input, string key, Encoding encoding)
238         {
239             return HashEncrypt(new HMACSHA384 (encoding.GetBytes(key)), input, encoding);
240         }
241 
242         #endregion HMAC-SHA384 加密
243 
244         #region HMAC-SHA512 加密
245 
246         /// <summary>
247         /// HMAC-SHA512 加密
248         /// </summary>
249         /// <param name="input"> 要加密的字元串 </param>
250         /// <param name="key"> 密鑰 </param>
251         /// <param name="encoding"> 字元編碼 </param>
252         /// <returns></returns>
253         public static string HMACSHA512Encrypt( string input, string key, Encoding encoding)
254         {
255             return HashEncrypt(new HMACSHA512 (encoding.GetBytes(key)), input, encoding);
256         }
257 
258         #endregion HMAC-SHA512 加密
259 
260         #endregion 哈希加密演算法
261 
262         #region 對稱加密演算法
263 
264         #region Des 加解密
265 
266         /// <summary>
267         /// DES 加密
268         /// </summary>
269         /// <param name="input"> 待加密的字元串 </param>
270         /// <param name="key"> 密鑰(8位) </param>
271         /// <returns></returns>
272         public static string DESEncrypt( string input, string key)
273         {
274             try
275             {
276                 var keyBytes = Encoding .UTF8.GetBytes(key);
277                 //var ivBytes = Encoding.UTF8.GetBytes(iv);
278 
279                 var des = DES .Create();
280                 des.Mode = CipherMode .ECB; //相容其他語言的 Des 加密演算法
281                 des.Padding = PaddingMode .Zeros; //自動補 0
282 
283                 using (var ms = new MemoryStream ())
284                 {
285                     var data = Encoding .UTF8.GetBytes(input);
286 
287                     using (var cs = new CryptoStream (ms, des.CreateEncryptor(keyBytes, IvBytes), CryptoStreamMode .Write)
288                         )
289                     {
290                         cs.Write(data, 0, data.Length);
291                         cs.FlushFinalBlock();
292                     }
293 
294                     return Convert .ToBase64String(ms.ToArray());
295                 }
296             }
297             catch
298             {
299                 return input;
300             }
301         }
302 
303         /// <summary>
304         /// DES 解密
305         /// </summary>
306         /// <param name="input"> 待解密的字元串 </param>
307         /// <param name="key"> 密鑰(8位) </param>
308         /// <returns></returns>
309         public static string DESDecrypt( string input, string key)
310         {
311             try
312             {
313                 var keyBytes = Encoding .UTF8.GetBytes(key);
314                 //var ivBytes = Encoding.UTF8.GetBytes(iv);
315 
316                 var des = DES .Create();
317                 des.Mode = CipherMode .ECB; //相容其他語言的Des加密演算法
318                 des.Padding = PaddingMode .Zeros; //自動補0
319 
320                 using (var ms = new MemoryStream ())
321                 {
322                     var data = Convert .FromBase64String(input);
323 
324                     using (var cs = new CryptoStream (ms, des.CreateDecryptor(keyBytes, IvBytes), CryptoStreamMode .Write)
325                         )
326                     {
327                         cs.Write(data, 0, data.Length);
328 
329                         cs.FlushFinalBlock();
330                     }
331 
332                     return Encoding .UTF8.GetString(ms.ToArray());
333                 }
334             }
335             catch
336             {
337                 return input;
338             }
339         }
340 
341         #endregion Des 加解密
342 
343         #endregion 對稱加密演算法
344 
345         #region 非對稱加密演算法
346 
347         /// <summary>
348         /// 生成 RSA 公鑰和私鑰
349         /// </summary>
350         /// <param name="publicKey"> 公鑰 </param>
351         /// <param name="privateKey"> 私鑰 </param>
352         public static void GenerateRSAKeys( out string publicKey, out string privateKey)
353         {
354             using (var rsa = new RSACryptoServiceProvider ())
355             {
356                 publicKey = rsa.ToXmlString( false );
357                 privateKey = rsa.ToXmlString( true );
358             }
359         }
360 
361         /// <summary>
362         /// RSA 加密
363         /// </summary>
364         /// <param name="publickey"> 公鑰 </param>
365         /// <param name="content"> 待加密的內容 </param>
366         /// <returns> 經過加密的字元串 </returns>
367         public static string RSAEncrypt( string publickey, string content)
368         {
369             var rsa = new RSACryptoServiceProvider();
370             rsa.FromXmlString(publickey);
371             var cipherbytes = rsa.Encrypt(Encoding .UTF8.GetBytes(content), false);
372 
373             return Convert .ToBase64String(cipherbytes);
374         }
375 
376         /// <summary>
377         /// RSA 解密
378         /// </summary>
379         /// <param name="privatekey"> 私鑰 </param>
380         /// <param name="content"> 待解密的內容 </param>
381         /// <returns> 解密後的字元串 </returns>
382         public static string RSADecrypt( string privatekey, string content)
383         {
384             var rsa = new RSACryptoServiceProvider();
385             rsa.FromXmlString(privatekey);
386             var cipherbytes = rsa.Decrypt(Convert .FromBase64String(content), false);
387 
388             return Encoding .UTF8.GetString(cipherbytes);
389         }
390 
391         #endregion 非對稱加密演算法
392     }
393 }

 

 


  【博主】反骨仔

  【出處】http://www.cnblogs.com/liqingwen/p/6155694.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 樹莓派是當前最火的嵌入計算平臺沒有之一,樹莓派可以給我們無數的想象,樹莓派的高性能、低功耗、低成本、可擴展性(最新的樹莓派原生支持WIFI和藍牙,這功能太贊了)深受大家的喜愛。雖然樹莓派到目前為止已經很好安裝系統了。但是要想方便的使用和部署開發的軟體還是比較麻煩的。 安裝環境的話,你的有樹莓派硬體( ...
  • 從此刻開始,我已封閉!概不接客! 像風一樣的男人,像風一樣的性格,無拘無束,不拘一格。那麼問題來了,當風遇到沙,不一定你是風兒,我是沙兒的纏纏綿綿,。也許是漫天黃沙,飛粒走石。如果我們期望擒住這漫天的塵埃,必須有強有力的手臂!那麼曬網、撒網、收網!讓他老實的封閉起來吧,永遠相依偎,阿拉! 讀在最前面 ...
  • Vs支持多種語言,但有可能創建項目時,預設的開發語言不是你需要的,比如:預設是Visual C++ 你可以通過"工具"----選項----導入和導出設置來修改。 引用: https://weblogs.asp.net/sreejukg/change-default-language-settings... ...
  • string 與 String,大 S 與小 S 之間有關字元串的秘密 字元串是 String 類型的對象,它的值是文本。 在內部,文本被存儲為 Char 對象的順序只讀集合。 C# 字元串末尾沒有以 null 結尾的字元;因此 C# 字元串可以包含任意數目的嵌入式 null 字元(“\0”)。 字 ...
  • 最近在熟悉Abp框架,其基於DDD領域驅動設計。。。前段可以繞過mvc直接調用根據app層動態生成的webapi,有點神奇~,Web API之前有簡單接觸過,WCF的輕量級版,一般用於做一寫開發性的服務介面,形式上類似與MVC,只是不渲染視圖(其他基於restful設計什麼的我不想去扯)。 因此我的 ...
  • C# 介面(Interface) 介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。 介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。 抽象類在 ...
  • 系統中經常會使用導出Excel的功能。 之前使用的是NPOI,但是導出數據行數多就報記憶體溢出。 最近看到EPPlus可以用來導出Excel,就自己測了下兩者導出上的差異。 NPIO官網地址:http://npoi.codeplex.com/ EPPlus官網地址:http://epplus.code ...
  • 文章作者 Julie Lerman 是 Microsoft MVP、.NET 導師和顧問,住在佛蒙特州的山區。您可以在全球的用戶組和會議中看到她對數據訪問和其他 .NET 主題的演示。她的博客地址是 [thedatafarm.com/blog][1]。她是“ Entity Framework 編程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...