Simulating MySql’s PASSWORD() encryption using .NET in Windows 8

PASSWORD() according to MySQL documentation is a double SHA1 algorithm.
In Win32 I was using this method:
public string GenerateMySQLHash(string key)
{
byte
[] keyArray = Encoding.UTF8.GetBytes(key);
SHA1Managed enc
= new SHA1Managed();
byte
[] encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray));
StringBuilder myBuilder
= new StringBuilder(encodedKey.Length);

foreach
(byte b in encodedKey)
myBuilder
.Append(b.ToString("X2"));

return "*" + myBuilder.ToString();
}
SHA1Managed object is not available in the Metro .net framework because the security stuff is now in Windows.Security.Cryptography and not in System.Security.Cryptography.
In the documentation, I see this example to obtain the SHA1 from a string:
 public String HashMsg(String strMsg)
{
// Convert the message string to binary data.
IBuffer buffUtf8Msg
= CryptographicBuffer.ConvertStringToBinary(strMsg, BinaryStringEncoding.Utf8);

// Create a HashAlgorithmProvider object.
HashAlgorithmProvider objAlgProv
= HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha1);

// Hash the message.
IBuffer buffHash
= objAlgProv.HashData(buffUtf8Msg);

// Verify that the hash length equals the length specified for the algorithm.
if (buffHash.Length != objAlgProv.HashLength)
{
throw new Exception
("There was an error creating the hash");
}

// Convert the hash to a string (for display).
return CryptographicBuffer.EncodeToBase64String(buffHash);
}
But I need a double SHA1 algorithm.
I finally found the solution :), I hope it help you:
        /// <summary>
/// Reverse a string
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ReverseString(string s)
{
char
[] arr = s.ToCharArray();
Array
.Reverse(arr);
return new string(arr);
}

/// <summary>
/// MySQL PASSWORD encryption
/// </summary>
/// <param name="strMsg"></param>
/// <returns></returns>
public String HashMsg(String strMsg)
{
// Convert the message string to binary data.
IBuffer buffUtf8Msg
= CryptographicBuffer.ConvertStringToBinary(strMsg, BinaryStringEncoding.Utf8);

// Create a HashAlgorithmProvider object.
HashAlgorithmProvider objAlgProv
= HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha1);

// Hash the message.
IBuffer buffHash
= objAlgProv.HashData(objAlgProv.HashData(buffUtf8Msg));

// Verify that the hash length equals the length specified for the algorithm.
if (buffHash.Length != objAlgProv.HashLength)
{
throw new Exception
("There was an error creating the hash");
}

byte
[] arrByteNew;
CryptographicBuffer
.CopyToByteArray(buffHash, out arrByteNew);
StringBuilder myBuilder
= new StringBuilder(arrByteNew.Length);

foreach
(var b in arrByteNew)
myBuilder
.Append(b.ToString("X2"));

// Concat with the STRING REVERSED
String stringReversed
= "*" + myBuilder.ToString() + ReverseString(strMsg);

buffUtf8Msg
= CryptographicBuffer.ConvertStringToBinary(s3, BinaryStringEncoding.Utf8);
buffHash
= objAlgProv.HashData(objAlgProv.HashData(buffUtf8Msg));

if (buffHash.Length != objAlgProv.HashLength)
{
throw new Exception
("There was an error creating the hash");
}

CryptographicBuffer
.CopyToByteArray(buffHash, out arrByteNew);
myBuilder
= new StringBuilder(arrByteNew.Length);

foreach
(var b in arrByteNew)
{
myBuilder
.Append(b.ToString("X2"));
}

stringReversed
= "*" + myBuilder.ToString();

return stringReversed;
}

Leave a Comment

Copyright © 2019 Soulmedic Theme All Rights Reserved | Design Themes

Atomic Flavor