根据MySQL文档,该算法是双SHA1哈希。在检查MySQL源代码时,您会在libmysql /
password.c中找到一个名为make_scrambled_password()的函数。该函数定义如下:
voidmake_scrambled_password(char *to, const char *password){ SHA1_ConTEXT sha1_context; uint8 hash_stage2[SHA1_HASH_SIZE]; mysql_sha1_reset(&sha1_context); mysql_sha1_input(&sha1_context, (uint8 *) password, (uint) strlen(password)); mysql_sha1_result(&sha1_context, (uint8 *) to); mysql_sha1_reset(&sha1_context); mysql_sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE); mysql_sha1_result(&sha1_context, hash_stage2); *to++= PVERSION41_CHAR; octet2hex(to, (const char*) hash_stage2, SHA1_HASH_SIZE);}使用此方法,您可以创建一个基本上执行相同操作的.NET副本。这是我想出的。当我运行SELECT PASSWORD(’test’);
针对我的MySQL本地副本,返回的值是:
*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
根据源代码(再次在password.c中),星号开头表示这是MySQL 4.1之后的加密密码方法。例如,当我在VB.Net中模拟功能时,这就是我想出的:
Public Function GenerateMySQLHash(ByVal strKey As String) As String Dim keyArray As Byte() = Encoding.UTF8.GetBytes(strKey) Dim enc = New SHA1Managed() Dim enpredKey = enc.ComputeHash(enc.ComputeHash(keyArray)) Dim myBuilder As New StringBuilder(enpredKey.Length) For Each b As Byte In enpredKey myBuilder.Append(b.ToString("X2")) Next Return "*" & myBuilder.ToString()End Function请记住,SHA1Managed()在System.Security.Cryptography命名空间中。此方法返回的输出与MySQL中的PASSWORD()调用相同。希望对您有帮助。
编辑:这是C#中的相同代码
public string GenerateMySQLHash(string key){ byte[] keyArray = Encoding.UTF8.GetBytes(key); SHA1Managed enc = new SHA1Managed(); byte[] enpredKey = enc.ComputeHash(enc.ComputeHash(keyArray)); StringBuilder myBuilder = new StringBuilder(enpredKey.Length); foreach (byte b in enpredKey) myBuilder.Append(b.ToString("X2")); return "*" + myBuilder.ToString();}


