在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 }

参考: