2011-11-09 5 views
0

使用してASP.NETハッシュパスワード:私は、ユーザによって入力されたパスワードをハッシュし、次のコードを、持って、その後、SQL Serverデータベースに格納するしましたMD5

Byte[] originalPassword; 
    Byte[] hashedPassword; 

    MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); 
    UTF8Encoding encoder = new UTF8Encoding(); 

    originalPassword = encoder.GetBytes(passwordBox.Text); 
    hashedPassword = md5Hasher.ComputeHash(originalPassword); 
    command.Parameters.Add(new SqlParameter("Password", hashedPassword)); 
    command.ExecuteNonQuery(); 

私の問題があることです私はすでにデータベースに保存されているいくつかの平文パスワードを持っています。 「0xA99ED ....」と表示されるので、どのように正確にこの新しいハッシュ形式に変更するのですか?

+0

[OK]を、あなたはMD5を使用する必要がありますので、何らかの理由で...少なくともあなたは塩を使うことはできませんでしたか?とにかく、あなたは文字列とバイナリが同等であると仮定しているようです - そうではありません、エンコーディングが必要です。 – Aaronaught

+0

問題は何ですか? nvarcharに変更すると、binary16列が同じ結果を持つことは期待できません。 –

+1

あなたの問題はその文章の中にあると思います。「手動でMD5を文字列形式で入力し、データ型をバイナリ(16)に戻しました。ハッシュの16進表現を入力し、16進表現の各文字のバイナリ値を取ってバイナリに変換した場合、結果は同じではありません... –

答えて

2

ハッシュ関数の出力は、テキストの集合ではなくバイトの集合です。したがって、テストとしてテキストを入力するときは、おそらくそのバイト配列のテキスト変換を入力することになります。単にSQLでバイナリ(16)に変換するのは間違いです。適切な変換を行う必要があります。これはSQLではできません。これはまた、列のデータ型を変更することがなぜ機能しないのかを説明します。

ハッシュが文字列として表現される場合、通常、各バイトの16進値を介して、または文字セットエンコーダーを介して渡されます。それらの間で切り替えるために使用すると、1つが使用されているか把握していないSQL

2
try this out first create a Windows form with 2 buttons and 2 text boxes 
1st button label Encrypt 
2nd button label Validate 
**--- Hashing using the MD5 class ---** 

use the following code below 
/// <summary> 
/// take any string and encrypt it using MD5 then 
/// return the encrypted data 
/// </summary> 
/// <param name="data">input text you will enterd to encrypt it</param> 
/// <returns>return the encrypted text as hexadecimal string</returns> 
private string GetMD5HashData(string data) 
{ 
    //create new instance of md5 
    MD5 md5 = MD5.Create(); 

    //convert the input text to array of bytes 
    byte[] hashData = md5.ComputeHash(Encoding.Default.GetBytes(data)); 

    //create new instance of StringBuilder to save hashed data 
    StringBuilder returnValue = new StringBuilder(); 

    //loop for each byte and add it to StringBuilder 
    for (int i = 0; i < hashData.Length; i++) 
    { 
     returnValue.Append(hashData[i].ToString()); 
    } 

    // return hexadecimal string 
    return returnValue.ToString(); 

} 

/// <summary> 
/// encrypt input text using MD5 and compare it with 
/// the stored encrypted text 
/// </summary> 
/// <param name="inputData">input text you will enterd to encrypt it</param> 
/// <param name="storedHashData">the encrypted text 
///   stored on file or database ... etc</param> 
/// <returns>true or false depending on input validation</returns> 
private bool ValidateMD5HashData(string inputData, string storedHashData) 
{ 
    //hash input text and save it string variable 
    string getHashInputData = GetMD5HashData(inputData); 

    if (string.Compare(getHashInputData, storedHashData) == 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
1

この方法は、素晴らしい作品にデータ型を切り替えることで、コードに変換を実行する必要があり、使用してMD5ハッシュから文字列を返します。 LINQ。これはMailChimp API 3.0で動作しましたが、バイト配列を返す前のコードではそうではありませんでした。

public static string GetMd5HashData(string yourString) 
    { 
    return string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(yourString)).Select(s => s.ToString("x2"))); 
    } 

はこちらをご覧ください:http://rion.io/2013/02/23/generating-an-md5-hash-from-a-string-using-linq/ここ

0

は、LINQを使用してVB.NET版です(まだVB.NETを使用している人のために):

Public Function GenerateMD5(ByVal plainText As String) As String 
     Return String.Join("", System.Security.Cryptography.MD5.Create().ComputeHash(System.Text.Encoding.ASCII.GetBytes(plainText)).Select(Function(x) x.ToString("x2"))) 
End Function 
関連する問題