欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HashHelper

程序员文章站 2022-05-29 09:35:13
在C#中,数据的Hash以MD5或SHA-1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比MD5强度高。 MD5与SHA1的比较: 1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用 ......

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

参考: