熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

.NET Hash 簡單實例

2013-11-15 12:53:04  來源: ASP編程 

  NET框架中提供了許多Hash類每種算法的實現方式不同但是在使用層面上NET為我們提供了幾乎一致的操作所謂一通百通在本節不打算把所有的算法都做演示因為這樣既沒必要性也鄙視讀者的智商

  關於SHA我們選用托管實現SHAManaged類做演示在實際應用中我建議各位讀者盡可能的使用托管實現因為基於加密服務的實現對特定的操作系統環境有依賴性

  代碼清單演示了簡單的Hash應用將一個字符串散列之後保存散列值然後對字符串做驗證操作

  代碼清單 SHAManaged類的簡單應用

  class Program

  {

  static SHAManaged shaM = new SHAManaged();

  static void Main(string[] args)

  {

  string testString = 大家好我是xuanhun歡迎閱讀我的文章!;

  byte[] hashY = GetHashData(testStringtestString);

  string testString = 大家好我是xuanhun歡迎閱讀我的文章!;

  byte[] hashY = GetHashData(testStringtestString);

  string ChangedString = 大家好我是xuanhun歡迎閱讀我的文章;

  byte[] hashChange = GetHashData(ChangedStringChangedString);

  ConsoleRead();

  }

  private static byte[] GetHashData(string sstring ys)

  {

  ConsoleWriteLine({}:ys);

  byte[] buffer = EncodingUTFGetBytes(s);

  byte[]hashBytes= shaMComputeHash(buffer);

  OutHash(hashBytes);

  return hashBytes;

  }

  private static void OutHash(byte[] hashBytes)

  {

  foreach (byte b in hashBytes)

  {

  ConsoleWrite({} b);

  }

  ConsoleWriteLine();

  ConsoleWriteLine();

  }

  }

  現在我們簡單分析代碼清單先看GetHashData方法它的主要工作是對傳入的字符串s做處理獲取它的hash值第一步通過EncodingUTFGetBytes(s)把字符串轉成byte數組然後對該byte數組進行散列操作完成操作的是下面這條語句

  byte[]hashBytes= shaMComputeHash(buffer)

  shaM是SHAManaged的實例這裡我們使用ComputeHash方法返回byte數組的Hash值

  OutHash方法用來輸出散列值

  Main方法中我定義了三個字符串第一個和第二個字符串完全一樣第三個字符串只少了一個歎號(下面我們看一下這段程序的運行結果如圖所示

  
代碼清單的運行結果

  從圖中我們很容易看出改掉一個字符hash值發生了很大的變化

  在實際應用中為了增強安全性我們更傾向於使用鍵控HashNET中的每個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 FileModeOpen);

  FileStream outStream = new FileStream(destFile FileModeCreate);

  byte[] hashValue = myhmacshaComputeHash(inStream);

  inStreamPosition = ;

  outStreamWrite(hashValue hashValueLength);

  int bytesRead;

  byte[] buffer = new byte[];

  do

  {

  bytesRead = inStreamRead(buffer );

  outStreamWrite(buffer bytesRead);

  } while (bytesRead > );

  myhmacshaClear();

  inStreamClose();

  outStreamClose();

  return;

  }

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

  {

  HMACSHA hmacsha = new HMACSHA(key);

  byte[] storedHash = new byte[hmacshaHashSize / ];

  FileStream inStream = new FileStream(sourceFile FileModeOpen);

  inStreamRead(storedHash storedHashLength);

  byte[] computedHash = hmacshaComputeHash(inStream);

  for (int i = ; i < storedHashLength; i++)

  {

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

  {

  ConsoleWriteLine(Hash值驗證失敗文件被篡改!);

  return false;

  }

  }

  ConsoleWriteLine(文件完整!);

  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();

  rngGetBytes(secretkey);

  Encript(secretkey file file);

  Decript(secretkey file);

  }

  catch (IOException e)

  {

  ConsoleWriteLine(eMessage);

  }

  ConsoleRead();

  }

  }

  }

  看代碼清單在Main方法中我定義了file和file兩個變量file為本地磁盤的一個已經存在的文件file是未存在的文件將由程序創建下面注意Main方法中的這兩句代碼

  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

  rngGetBytes(secretkey);

  RNGCryptoServiceProvider類提供方法用來生成高強度隨機數這裡我們用來生成作為HMACSHA類的加密和解密的密鑰

  Encript方法用來使用HMACSHA類生成文件file的加密Hash值我們首先創建了兩個文件流inStream和outStream分別對應file和file然後讀取file的內容使用myhmacshaComputeHash方法獲取加密的Hash值並將該值寫入file

  Decript方法用來驗證文件完整性驗證文件完整性的方法很簡單我們讀出保存在file中key的Hash數據然後使用之前的Key對該數據執行Hash如果得到的Hash值和取出的KeyHash值相同則數據完整

  執行加密Hash的過程後file和file的文件內容如圖所示

  
執行加密Hash的過程後file和file的文件內容

  從圖中我們可以看出加密Hash值被添加在原文內容的前邊

  驗證結果如圖所示

  


From:http://tw.wingwit.com/Article/program/ASP/201311/21811.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.