HashHelper

在C#中,数据的Hash以MD5或SHA-1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比MD5强度高。

MD5与SHA1的比较:

  1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

  2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

  3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

SHA-1和MD5在C#中的实现:

 1 public class HashHelper
 2 {
 3     /// <summary>
 4     /// 计算文件的 MD5 值
 5     /// </summary>
 6     /// <param name="fileName">要计算 MD5 值的文件名和路径</param>
 7     /// <returns>MD5 值16进制字符串</returns>
 8     public static string MD5File(string fileName)
 9     {
10         return HashFile(fileName, "md5");
11     }
12 
13     /// <summary>
14     /// 计算文件的 sha1 值
15     /// </summary>
16     /// <param name="fileName">要计算 sha1 值的文件名和路径</param>
17     /// <returns>sha1 值16进制字符串</returns>
18     public static string SHA1File(string fileName)
19     {
20         return HashFile(fileName, "sha1");
21     }
22 
23     /// <summary>
24     /// 计算文件的哈希值
25     /// </summary>
26     /// <param name="fileName">要计算哈希值的文件名和路径</param>
27     /// <param name="algName">算法:sha1,md5</param>
28     /// <returns>哈希值16进制字符串</returns>
29     private static string HashFile(string fileName, string algName)
30     {
31         if (!System.IO.File.Exists(fileName))
32         {
33             return string.Empty;
34         }
35 
36         System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
37         byte[] hashBytes = HashData(fs, algName);
38         fs.Close();
39         return ByteArrayToHexString(hashBytes);
40     }
41 
42     /// <summary>
43     /// 计算哈希值
44     /// </summary>
45     /// <param name="stream">要计算哈希值的 Stream</param>
46     /// <param name="algName">算法:sha1,md5</param>
47     /// <returns>哈希值字节数组</returns>
48     private static byte[] HashData(System.IO.Stream stream, string algName)
49     {
50         System.Security.Cryptography.HashAlgorithm algorithm;
51         if (algName == null)
52         {
53             throw new ArgumentNullException("algName 不能为 null");
54         }
55 
56         if (string.Compare(algName, "sha1", true) == 0)
57         {
58             algorithm = System.Security.Cryptography.SHA1.Create();
59         }
60         else
61         {
62             if (string.Compare(algName, "md5", true) != 0)
63             {
64                 throw new Exception("algName 只能使用 sha1 或 md5");
65             }
66             algorithm = System.Security.Cryptography.MD5.Create();
67         }
68 
69         return algorithm.ComputeHash(stream);
70     }
71 
72     /// <summary>
73     /// 字节数组转换为16进制表示的字符串
74     /// </summary>
75     private static string ByteArrayToHexString(byte[] buf)
76     {
77         return BitConverter.ToString(buf).Replace("-", "");
78     }
79 }

参考:http://blog.rdiframework.net/article/222

posted @ 2019-09-29 09:09  酷学大叔  阅读(598)  评论(0编辑  收藏  举报