• 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

  • 相关阅读:
    11G-使用跨平台增量备份减少可移动表空间的停机时间 XTTS (Doc ID 1389592.1)
    如何在asm上定位数据块
    log file switch (checkpoint incomplete)
    踩坑记录(git)-误提交target文件夹删除办法
    踩坑记录(java)-双层增强for调用remove(obj)报错 java.util.ConcurrentModificationException(并发修改异常)
    Zookeeper服务端的创建及简单的客户端创建节点
    SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around
    EasyExcel示例(阿里巴巴)基于Maven
    Redis简单命令(部分示例代码)
    sqlserver日志处理不当而造成的隐患
  • 原文地址:https://www.cnblogs.com/az4215/p/11605882.html
Copyright © 2020-2023  润新知