在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) == )
  57. {
  58. algorithm = System.Security.Cryptography.SHA1.Create();
  59. }
  60. else
  61. {
  62. if (string.Compare(algName, "md5", true) != )
  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

HashHelper的更多相关文章

  1. 【开源】OSharp框架解说系列(3):扩展方法

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  2. 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇

    之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...

  3. 哈希(Hash)与加密(Encrypt)相关内容

    1.哈希(Hash)与加密(Encrypt)的区别 哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可 ...

  4. Hash MD5 CRC 知识

    本文旨在科普安全相关的知识,并附一个C#实现的文件管理工具. Hash 安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的五种安全 ...

  5. .NET(C#) File类的常用方法

    MSDN的File类 File类在MSDN:https://msdn.microsoft.com/zh-cn/library/system.io.file_methods(v=vs.110).aspx ...

  6. 哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

    0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对 ...

  7. C# 计算文件的 Hash 值

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

  8. C# 计算字符串/文件的哈希值(MD5、SHA)

    原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...

  9. C# 计算文件的HASH

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

随机推荐

  1. element-admin中echarts图标宽度无法修改

    默认示例 <template> <div> <el-row :gutter="0"> <el-col :xs="24" ...

  2. MySQL基于报错注入1

    0x1 判断注入点: http://www.xxxx.ro/s.php?id=1' 那么尝试闭合下单引号 http://www.xxxx.ro/s.php?id=1' --+ 0x2 枚举下表的列 h ...

  3. [转]JVM系列四:生产环境参数实例及分析【生产环境实例增加中】

    原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/05/2038331.html java application项目(非web项目) 改进前: ...

  4. 5-6 可视化库Seaborn-Facetgrid使用和绘制多变量

      基本工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象.然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集 FacetGrid.map_data ...

  5. Shell命令-系统信息及显示之df、top

    文件及内容处理 - df.top 1. df:报告文件系统磁盘空间的使用情况 df命令的功能说明 df 命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计. df命令的语法格式 df [O ...

  6. Kettle 执行SQL脚本

    以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 本文将对Kettle5中常用步骤字段选择(又名选择/改名值,英文原名:Select Values)进行详细解释.这个步骤的功能非常强大, ...

  7. 深度自编码器(Deep Autoencoder)MATLAB解读

    深度自编码器(Deep Autoencoder)MATLAB解读 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇文章主要讲解Hinton在2006 ...

  8. js 时间戳转yyyy-MM-dd HH-mm-ss工具类

    转载自:https://blog.csdn.net/shan1774965666/article/details/55049819 在web开发中,我们经常需要用js将时间戳转yyyy-MM-dd H ...

  9. react解析markdown文件

    当当当又get到了一个新技能,使用react-markdown来直接解析markdown文件(咳咳,小菜鸟的自娱自乐) 项目中遇到了一个API的那种展示方式,类似于入门手册啥的那种,如果是一个个调用接 ...

  10. RedisTemplate操作Redis(spring-data-redis)

    参看博客:https://www.cnblogs.com/songanwei/p/9274348.html 使用文档:StringRedisTemplate+RedisTemplate使用说明