本文旨在科普安全相关的知识,并附一个C#实现的文件管理工具。

Hash

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的五种安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的概率很高。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):

HASH是根据文件的内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的, 所以HASH值就成了每一个文件的身份证。

不同HASH值的文件内容也是不相同的,相同的HASH值的文件的内容肯定是完全相同(即使文件名不同).

HASH值还有文件校验的功能,相当于文件的校验码. 所以还可以用来检查文件下载是否正确(比如我们在下载系统镜像或其它开源软件时,官网都会提供文件的HASH值,让我们通过对比HASH值来判断文件是否被修改过)。

文件的Hash值在下载文件的校验方面有很大的用途,Hash值是文件内容的通过二进制码进行一系列的变换生成出来的,即使文件名发生变化,Hash的值也不会发生改变。因此在开发的过程中一般比较两个文件是否相同都是去比较两个文件的Hash值。

MD5

英文全称Message-Digest Algorithm(消息摘要算法)

在下载一下东西时,经常在一些压缩包属性里,看到md5值。而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX。这有什么作用呢?

白话白话:md5,其实就是一中算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。

所以,有人修过压缩包后,就会生成新的串,这时就可以拿网站提供的串和新生成的串对比,如果不同,那就是被人修过过了。

更多请查看:https://zh.wikipedia.org/wiki/MD5 / http://www.weixuehao.com/archives/474

CRC

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函數,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方是由W. Wesley Peterson于1961年发表

HashHelper

下面一个C#版本的工具类,主要功能是计算文件Hash,文件MD5,文件的CRC32

using System;
using System.IO;
using System.Text;/// <summary>
/// 提供用于计算指定文件哈希值的方法
/// <example>例如计算文件的MD5值:
/// <code>
///   String hashMd5=HashHelper.GetMD5("MyFile.txt");
/// </code>
/// </example>
/// <example>例如计算文件的CRC32值:
/// <code>
///   String hashCrc32 = HashHelper.GetCRC32("MyFile.txt");
/// </code>
/// </example>
/// <example>例如计算文件的SHA1值:
/// <code>
///   String hashSha1 =HashHelper.GetSHA1("MyFile.txt");
/// </code>
/// </example>
/// </summary>
public class HashHelper
{/// <summary>///  计算指定文件的MD5值/// </summary>/// <param name="fileName">指定文件的完全限定名称</param>/// <returns>返回值的字符串形式</returns>public static String GetMD5(String fileName){String hashMD5 = String.Empty;//检查文件是否存在,如果文件存在则进行计算,否则返回空值if (File.Exists(fileName)){using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//计算文件的MD5值System.Security.Cryptography.MD5 calculator = System.Security.Cryptography.MD5.Create();Byte[] buffer = calculator.ComputeHash(fs);calculator.Clear();//将字节数组转换成十六进制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < buffer.Length; i++){stringBuilder.Append(buffer[i].ToString("x2"));}hashMD5 = stringBuilder.ToString();}//关闭文件流}//结束计算return hashMD5;}//ComputeMD5/// <summary>///  计算指定文件的CRC32值/// </summary>/// <param name="fileName">指定文件的完全限定名称</param>/// <returns>返回值的字符串形式</returns>public static String GetCRC32(String fileName){String hashCRC32 = String.Empty;//检查文件是否存在,如果文件存在则进行计算,否则返回空值if (File.Exists(fileName)){using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//计算文件的CSC32值Crc32 calculator = new Crc32();Byte[] buffer = calculator.ComputeHash(fs);calculator.Clear();//将字节数组转换成十六进制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < buffer.Length; i++){stringBuilder.Append(buffer[i].ToString("x2"));}hashCRC32 = stringBuilder.ToString();}//关闭文件流
        }return hashCRC32;}//ComputeCRC32/// <summary>/// 获取文件的SHA1/// </summary>/// <param name="fileName"></param>/// <returns></returns>public static String GetSHA1(String fileName){String hashSHA1 = String.Empty;//检查文件是否存在,如果文件存在则进行计算,否则返回空值if (File.Exists(fileName)){using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//计算文件的SHA1值System.Security.Cryptography.SHA1 calculator = System.Security.Cryptography.SHA1.Create();Byte[] buffer = calculator.ComputeHash(fileStream);calculator.Clear();//将字节数组转换成十六进制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int bufferIdx = 0; bufferIdx < buffer.Length; bufferIdx++){stringBuilder.Append(buffer[bufferIdx].ToString("x2"));}hashSHA1 = stringBuilder.ToString();}//关闭文件流
        }else{Console.Error.WriteLine("{0}文件找不到!", fileName);}return hashSHA1;}//end GetSHA1
}/// <summary>
/// 提供 CRC32 算法的实现
/// </summary>
public class Crc32 : System.Security.Cryptography.HashAlgorithm
{public const UInt32 DefaultPolynomial = 0xedb88320;public const UInt32 DefaultSeed = 0xffffffff;private UInt32 hash;private UInt32 seed;private UInt32[] table;private static UInt32[] defaultTable;public Crc32(){table = InitializeTable(DefaultPolynomial);seed = DefaultSeed;Initialize();}public Crc32(UInt32 polynomial, UInt32 seed){table = InitializeTable(polynomial);this.seed = seed;Initialize();}public override void Initialize(){hash = seed;}protected override void HashCore(byte[] buffer, int start, int length){hash = CalculateHash(table, hash, buffer, start, length);}protected override byte[] HashFinal(){byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);this.HashValue = hashBuffer;return hashBuffer;}public static UInt32 Compute(byte[] buffer){return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length);}public static UInt32 Compute(UInt32 seed, byte[] buffer){return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length);}public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer){return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length);}private static UInt32[] InitializeTable(UInt32 polynomial){if (polynomial == DefaultPolynomial && defaultTable != null){return defaultTable;}UInt32[] createTable = new UInt32[256];for (int i = 0; i < 256; i++){UInt32 entry = (UInt32)i;for (int j = 0; j < 8; j++){if ((entry & 1) == 1)entry = (entry >> 1) ^ polynomial;elseentry = entry >> 1;}createTable[i] = entry;}if (polynomial == DefaultPolynomial){defaultTable = createTable;}return createTable;}private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size){UInt32 crc = seed;for (int i = start; i < size; i++){unchecked{crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff];}}return crc;}private byte[] UInt32ToBigEndianBytes(UInt32 x){return new byte[] { (byte)((x >> 24) & 0xff), (byte)((x >> 16) & 0xff), (byte)((x >> 8) & 0xff), (byte)(x & 0xff) };}
}//end class: Crc32

Hash MD5 CRC 知识相关推荐

  1. gulp html 缓存,gulp 给静态资源文件添加hash(md5)后缀 防止缓存

    第一步,安装所需的包,用npm安装,如下: npm install gulp gulp-rev run-sequence gulp-rev-collector --save-dev 第二步,在gulp ...

  2. *,vol.Delphi.Setup.Hash.MD5

    ; ; Created by AccuHash 2.0 (http://www.accuhash.com) ; 90edfa2397c70aa543d992d18341cd32 *1一键GHOST硬盘 ...

  3. CryptoHelper HMAC/X509/RSA/TripleDes/Hash/MD5/SHA1 (Release 3)

    转载于:https://www.cnblogs.com/Microshaoft/archive/2011/05/11/2043527.html

  4. java i 底层原理,《Java基础知识》Java Hash底层原理

    前言 了解到JDK8对HashMap进行了优化,就一起了解一下JDK8的HashMap. 原理 1. 哈希表的原理 首先需要一张Hash表,Java通过数据实现:默认长度位16,并且. 第一步插入张三 ...

  5. Linux 大文件crc计算,Windows和Linux下使用MD5、SHA1、CRC32校验备份文件的完整性

    因为经常会用到备份加密压缩过的数据到不同的服务器,然而这些服务器是否可靠,服务器的提供者是否值得信任,为了保证文件的完整性不被篡改,也为了多个地方存储的同一个大文件的备份自己能够快速的识别出来是否是同 ...

  6. 关于C语言的一个简单工具类(包含常用进制转换和CRC,MD5,BBC)

    目录 一. 前言 二. 进制转换和格式控制 十进制转为十六进制函数 十六进制字符串转换成十六进制数组 把字符串中的空格符号删除 比较两个数组之间是否相同 命令响应数据中查找关键字 16位数据高低字节互 ...

  7. hash哈希算法,MD5、SHA1、SHA512、SHA256

    hash算法可以将任意长度的二进制值(明文)映射为较短的固定长度的二进制值(hash值),hash值又称为数字指纹.数字摘要 func StudyHASH(str string, hashType s ...

  8. 布谷鸟哈希函数的参数_系统学习hash算法(哈希算法)

    系统学习hash算法(哈希算法) 转载请说明出处. 前言: 关于本文<系统学习hash算法>的由来.在看到了<十一.从头到尾彻底解析Hash 表算法>这篇文章之后,原文中没有暴 ...

  9. 用Java获取文件的MD5校验和

    我正在寻找使用Java获取文件的MD5校验和. 我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西. 怎么做? #1楼 Guava现在提供了一个新的,一致的哈希API,它比JDK中提 ...

最新文章

  1. 算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)
  2. Linux控制台打开显示字符画,Linux 命令行字符画工具
  3. 数据结构:Binary and other trees(数据结构,算法及应用(C++叙事描述语言)文章8章)...
  4. JLBH示例4 – QuickFix vs ChronicleFix基准化
  5. APL开发日志--2013-01-17
  6. android获取显示屏尺寸大小,Android 屏幕各尺寸的获取
  7. ubuntu修改静态IP地址
  8. python电话簿_python 联系簿
  9. 使用SYUGI快速创建类似于Office XP/2003 界面风格的应用程序
  10. 第三次作业_03功能测试
  11. yocto之相关class总结
  12. 计算机毕业设计Django毕业设计论文源代码服装展示平台电商商城购物系统
  13. 使用第三方类库对html进行解析
  14. 运营简史:互联网运营的20年发展与演变
  15. 华为电脑和手机一碰传_体验华为“一碰传”高科技,实现手机和电脑互传文件...
  16. ATECC508A芯片开发笔记(一):初识加密芯片
  17. 如何使用 Kubernetes 部署 Flink 应用
  18. 【PowerDesigner】UML建模
  19. Linux Centos 7软件防火墙
  20. 魔法少女小圆计算机音乐,魔法少女小圆 无损音乐合集

热门文章

  1. 解决TypeError: Tensor is unhashable if Tensor equality is enabled. Instead, use tensor.experimental_re
  2. python实现点到平面的距离
  3. ProGuard中keep到底有什么作用
  4. 安装使用Frida在Android上进行hook
  5. Android魔术——手把手教你实现水晶球波浪进度条
  6. centOS安装java
  7. Mysql 中的Text字段的范围
  8. Laravel 用户认证与登陆
  9. DevExpress 中 在做全选的全消功能的时候 加快效率
  10. 前台线程和后台线程(Foreground and Background Threads)