2011-06-28 17 views
10

我有用來生成散列的方法的散列:匹配在C#創建與SQL

public static string GetMD5Hash(string input) 
    { 
     System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 

     bs = x.ComputeHash(bs); 

     System.Text.StringBuilder s = new System.Text.StringBuilder(); 

     foreach (byte b in bs) 
     { 
      s.Append(b.ToString("x2").ToLower()); 
     } 
     return s.ToString(); 
    } 

我然後保存在一個varchar(255)列的散列。知道原始輸入字符串是什麼,是否有可能使用sql(2005)?獲得存儲在varchar(255)列中的相同散列值?

我已經嘗試過使用不同的數據類型,轉換和hashbytes()函數,但一直未能關閉。我嘗試失敗:(的

select convert(varchar, hashbytes('MD5', convert(varbinary(200), '<censored>',0))) 
+0

請勿使用MD5;這是不安全的。 – SLaks

+1

爲什麼'varchar(255)'? 'MD5CryptoServiceProvider'從'ComputeHash()'返回一個16字節的數組,所以你應該使用char(32)(如果你把它保存爲hex) – BrokenGlass

+0

也許是因爲ToLower()? – Greenisha

回答

5

從#C與 「bleepbloop」:04d3f95947702213e23730a0e8fac6c3

然後

select convert(varchar(32), hashbytes('MD5', 'bleepbloop'), 2) 

>> 04D3F95947702213E23730A0E8FAC6C3 

或者你可以只保存&比較二進制。

+0

這工作...謝謝一個人:) – Craigt

3

這裏的問題是,x2越來越十六進制數據編碼,其中,作爲convert越來越字節的服務器的配置解碼 (這不是真正有效的,因爲這些數據不是基於文本的)。非常不同的東西。如果保留爲varbinary並與byte[]比較,那麼應該沒問題。

如果您使用SQL Serv呃2008年,您還可以使用:

select convert(varchar(32), hashbytes('MD5', convert(varbinary(200), 
      '<censored>',0)), 2) 

得到十六進制編碼版本(可以使用的1代替2獲得領先0x

+0

感謝您的回覆和額外的信息。 – Craigt