知识大全 .NET Hash 简单实例

Posted 文件

篇首语:水深难见底,虎死不倒威。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .NET Hash 简单实例相关的知识,希望对你有一定的参考价值。

.NET Hash 简单实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   NET框架中提供了许多Hash类 每种算法的实现方式不同 但是在使用层面上 NET为我们提供了几乎一致的操作 所谓一通百通 在本节不打算把所有的算法都做演示 因为这样既没必要性也鄙视读者的智商

  关于SHA 我们选用托管实现SHA Managed类做演示 在实际应用中 我建议各位读者尽可能的使用托管实现 因为基于加密服务的实现对特定的操作系统环境有依赖性

  代码清单 演示了简单的Hash应用 将一个字符串散列之后保存散列值 然后对字符串做验证操作

  代码清单 SHA Managed类的简单应用

  class Program

  

  static SHA Managed sha M = new SHA Managed();

  static void Main(string[] args)

  

  string testString = 大家好 我是xuanhun 欢迎阅读我的文章! ;

  byte[] hashY = GetHashData(testString testString);

  string testString = 大家好 我是xuanhun 欢迎阅读我的文章! ;

  byte[] hashY = GetHashData(testString testString );

  string ChangedString = 大家好 我是xuanhun 欢迎阅读我的文章 ;

  byte[] hashChange = GetHashData(ChangedString ChangedString);

  Console Read();

  

  private static byte[] GetHashData(string s string ys)

  

  Console WriteLine( : ys);

  byte[] buffer = Encoding UTF GetBytes(s);

  byte[]hashBytes= sha M ComputeHash(buffer);

  OutHash(hashBytes);

  return hashBytes;

  

  private static void OutHash(byte[] hashBytes)

  

  foreach (byte b in hashBytes)

  

  Console Write( b);

  

  Console WriteLine();

  Console WriteLine();

  

  

  现在我们简单分析代码清单 先看GetHashData方法 它的主要工作是对传入的字符串s做处理 获取它的hash值 第一步通过Encoding UTF GetBytes(s)把字符串转成byte数组 然后对该byte数组进行散列操作 完成操作的是下面这条语句

  byte[]hashBytes= sha M ComputeHash(buffer)

  sha M是SHA Managed的实例 这里我们使用ComputeHash方法返回byte数组的Hash值

  OutHash方法用来输出散列值

  Main方法中我定义了三个字符串 第一个和第二个字符串完全一样 第三个字符串只少了一个叹号( ! ) 下面我们看一下这段程序的运行结果 如图 所示

  图 代码清单 的运行结果

  从图 中我们很容易看出 改掉一个字符 hash值发生了很大的变化

  在实际应用中 为了增强安全性 我们更倾向于使用键控Hash NET中的每个Hash加密算法都有对应的键控Hash类 针对于上个例子 我们演示如何使用HMACSHA 类 实例程序如代码清单 所示

  代码清单 HMACSHA 类应用实例

  class Program

  

  public static void Encript(byte[] key String sourceFile String destFile)

  

  HMACSHA myhmacsha = new HMACSHA (key);

  FileStream inStream = new FileStream(sourceFile FileMode Open);

  FileStream outStream = new FileStream(destFile FileMode Create);

  byte[] hashValue = myhmacsha ComputeHash(inStream);

  inStream Position = ;

  outStream Write(hashValue hashValue Length);

  int bytesRead;

  byte[] buffer = new byte[ ];

  do

  

  bytesRead = inStream Read(buffer );

  outStream Write(buffer bytesRead);

   while (bytesRead > );

  myhmacsha Clear();

  inStream Close();

  outStream Close();

  return;

  

  public static bool Decript(byte[] key String sourceFile)

  

  HMACSHA hmacsha = new HMACSHA (key);

  byte[] storedHash = new byte[hmacsha HashSize / ];

  FileStream inStream = new FileStream(sourceFile FileMode Open);

  inStream Read(storedHash storedHash Length);

  byte[] putedHash = hmacsha ComputeHash(inStream);

  for (int i = ; i < storedHash Length; i++)

  

  if (putedHash[i] != storedHash[i])

  

  Console WriteLine( Hash值验证失败文件被篡改! );

  return false;

  

  

  Console WriteLine( 文件完整! );

  return true;

  

  public static void Main(string[] Fileargs)

  

  string file = @ f:\\ txt ;

  string file = @ f:\\ txt ;

  try

  

  byte[] secretkey = new Byte[ ];

  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

  rng GetBytes(secretkey);

  Encript(secretkey file file );

  Decript(secretkey file );

  

  catch (IOException e)

  

  Console WriteLine(e Message);

  

  Console Read();

  

  

  

  看代码清单 在Main方法中 我定义了file 和file 两个变量 file 为本地磁盘的一个已经存在的文件 file 是未存在的文件 将由程序创建 下面注意Main方法中的这两句代码

  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

  rng GetBytes(secretkey);

  RNGCryptoServiceProvider类提供方法用来生成高强度随机数 这里我们用来生成作为HMACSHA 类的加密和解密的密钥

  Encript方法用来使用HMACSHA 类生成文件file 的加密Hash值 我们首先创建了两个文件流inStream和outStream分别对应file 和file 然后读取file 的内容 使用myhmacsha ComputeHash方法获取加密的Hash值 并将该值写入file

  Decript方法用来验证文件完整性 验证文件完整性的方法很简单 我们读出保存在file 中key的Hash数据 然后使用之前的Key对该数据执行Hash 如果得到的Hash值和取出的KeyHash值相同 则数据完整

  执行加密Hash的过程后 file 和file 的文件内容如图 所示

  图 执行加密Hash的过程后 file 和file 的文件内容

  从图中 我们可以看出 加密Hash值被添加在原文内容的前边

  验证结果如图 所示

cha138/Article/program/ASP/201311/21811

相关参考

知识大全 一个简单的ASP.NET Forms 身份认证的实例方法

一个简单的ASP.NETForms身份认证的实例方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 VB.NET多线程开发实例

同Java一样简单!VB.NET多线程开发实例  以下文字资料是由(历史新知网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  VBNET

知识大全 asp.net 数据绑定的实例代码

这篇文章介绍了aspnet数据绑定的实例代码有需要的朋友可以参考一下 复制代码代码如下:cha138/Article/program/net/201311/14140

知识大全 实例讲解.NET多线程执行函数

实例讲解.NET多线程执行函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这里为什么会出现多

知识大全 vb.net中应用ArrayList 实例

vb.net中应用ArrayList实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Arra

知识大全 .Net平台应用程序唯一运行实例

.Net平台应用程序唯一运行实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要  本文阐述

知识大全 一个ASP.Net下的WebShell实例

一个ASP.Net下的WebShell实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一个ASP

知识大全 .NET中自定义配置节点实例详解

.NET中自定义配置节点实例详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一目的  一般应

知识大全 ASP.NET用户控件操作ASPX页面

ASP.NET用户控件操作ASPX页面  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一简单实例

知识大全 Hash算法大全(java实现)

Hash算法大全(java实现)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hash算法有很