2011-06-28 10 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)を使用してください(0x16として保存した場合) – BrokenGlass

+0

これはToLower()のためでしょうか? – Greenisha

答えて

5

取得する: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) 

"bleepbloop" と#Cから16進数でエンコードされたバージョン(あなたがリードする0xを取得する代わりに21を使用することができます)

+0

応答と追加情報をありがとう。 – Craigt