2012-03-20 16 views
2

私の会社では、データベースに格納する前にそれをパスワードをハッシュするには、次のアルゴリズムを使用しています:MD5ハッシュ混乱

public static string Hash(string value) 
    { 
     byte[] valueBytes = new byte[value.Length * 2]; 

     Encoder encoder = Encoding.Unicode.GetEncoder(); 
     encoder.GetBytes(value.ToCharArray(), 0, value.Length, valueBytes, 0, true); 

     MD5 md5 = new MD5CryptoServiceProvider(); 
     byte[] hashBytes = md5.ComputeHash(valueBytes); 

     StringBuilder stringBuilder = new StringBuilder(); 

     for (int i = 0; i < hashBytes.Length; i++) 
     { 
      stringBuilder.Append(hashBytes[i].ToString("x2")); 
     } 

     return stringBuilder.ToString(); 
    } 

私にそれは些細なMD5ハッシュのように聞こえるが、私は、パスワード(123456)と一致しようとしたときアルゴリズムは私にce0bfd15059b68d67688884d7a3d3e8cを与え、標準のmd5ハッシュを使用すると、それは私にe10adc3949ba59abbe56e057f20f883eを与えます。

サイトのiOSバージョンがビルド中で、ユーザーがログインする必要がある場合、パスワードは送信前にハッシュされます。私は、標準のMD5ハッシュを使用するようにiOSチームに指示しましたが、もちろんそれはうまくいきません。

標準のmd5を使用してパスワードを解読して再度ハッシュすることはできません。同じハッシュを取得するには、iOSチームに正確に何を伝えるのかわかりません。

助けが必要ですか?

+1

これはおそらくエンコードのためです。私はPHPのように機能する関数を提供します。 – Schiavini

答えて

7

両端(おそらくUTF8)で同じエンコードを使用する必要があります。

あなたは

byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes("123456")); 

でコードを交換する場合は、e10adc3949ba59abbe56e057f20f883eを取得します。

+0

良い点!ありがとう、私は代わりにユニコードを使用するように指示します。 –

+1

@myself:.Netの 'Encoding.Unicode'はUTF16リトルエンディアンを意味します。 – SLaks

2

UnicodeではなくUTF8を使用する必要があります。次のコードは、PHP md5()関数とまったく同じように動作します。

public static string md5(string value) 
    { 
     byte[] encoded = ASCIIEncoding.UTF8.GetBytes(value); 

     MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider(); 
     byte[] hashCode = md5Provider.ComputeHash(encoded); 

     string ret = ""; 
     foreach (byte a in hashCode) 
      ret += String.Format("{0:x2}", a); 
     return ret; 
    } 
+0

私はコードを変更することはできませんが、代わりにユニコードを使用するように指示します。 –

+1

ええ、あなたがUnicodeを使うように言うなら、それはうまくいくはずです – Schiavini