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     /// 
 4     /// 计算文件的 MD5 值
 5     /// 
 6     /// 要计算 MD5 值的文件名和路径
 7     /// MD5 值16进制字符串
 8     public static string MD5File(string fileName)
 9     {
10         return HashFile(fileName, "md5");
11     }
12 
13     /// 
14     /// 计算文件的 sha1 值
15     /// 
16     /// 要计算 sha1 值的文件名和路径
17     /// sha1 值16进制字符串
18     public static string SHA1File(string fileName)
19     {
20         return HashFile(fileName, "sha1");
21     }
22 
23     /// 
24     /// 计算文件的哈希值
25     /// 
26     /// 要计算哈希值的文件名和路径
27     /// 算法:sha1,md5
28     /// 哈希值16进制字符串
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     /// 
43     /// 计算哈希值
44     /// 
45     /// 要计算哈希值的 Stream
46     /// 算法:sha1,md5
47     /// 哈希值字节数组
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     /// 
73     /// 字节数组转换为16进制表示的字符串
74     /// 
75     private static string ByteArrayToHexString(byte[] buf)
76     {
77         return BitConverter.ToString(buf).Replace("-", "");
78     }
79 }

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

你可能感兴趣的:(HashHelper)