Theo tài liệu MySQL, thuật toán là một hàm băm SHA1 kép. Khi kiểm tra mã nguồn MySQL, bạn tìm thấy một hàm có tên make_scrambled_password () trong libmysql / password.c. Hàm được định nghĩa như sau:
/*
MySQL 4.1.1 password hashing: SHA conversion (see RFC 2289, 3174) twice
applied to the password string, and then produced octet sequence is
converted to hex string.
The result of this function is used as return value from PASSWORD() and
is stored in the database.
SYNOPSIS
make_scrambled_password()
buf OUT buffer of size 2*SHA1_HASH_SIZE + 2 to store hex string
password IN NULL-terminated password string
*/
void
make_scrambled_password(char *to, const char *password)
{
SHA1_CONTEXT sha1_context;
uint8 hash_stage2[SHA1_HASH_SIZE];
mysql_sha1_reset(&sha1_context);
/* stage 1: hash password */
mysql_sha1_input(&sha1_context, (uint8 *) password, (uint) strlen(password));
mysql_sha1_result(&sha1_context, (uint8 *) to);
/* stage 2: hash stage1 output */
mysql_sha1_reset(&sha1_context);
mysql_sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE);
/* separate buffer is used to pass 'to' in octet2hex */
mysql_sha1_result(&sha1_context, hash_stage2);
/* convert hash_stage2 to hex string */
*to++= PVERSION41_CHAR;
octet2hex(to, (const char*) hash_stage2, SHA1_HASH_SIZE);
}
Với phương pháp này, bạn có thể tạo một đối tác .NET về cơ bản thực hiện điều tương tự. Đây là những gì tôi đã nghĩ ra. Khi tôi chạy SELECT PASSWORD ('test'); so với bản sao MySQL cục bộ của tôi, giá trị được trả về là:
*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
Theo mã nguồn (một lần nữa trong password.c), dấu hoa thị ở đầu cho biết rằng đây là phương pháp mã hóa mật khẩu hậu MySQL 4.1. Khi tôi mô phỏng chức năng trong VB.Net chẳng hạn, đây là những gì tôi nghĩ ra:
Public Function GenerateMySQLHash(ByVal strKey As String) As String
Dim keyArray As Byte() = Encoding.UTF8.GetBytes(strKey)
Dim enc = New SHA1Managed()
Dim encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray))
Dim myBuilder As New StringBuilder(encodedKey.Length)
For Each b As Byte In encodedKey
myBuilder.Append(b.ToString("X2"))
Next
Return "*" & myBuilder.ToString()
End Function
Hãy nhớ rằng SHA1Managed () nằm trong không gian tên System.Security.Cryptography. Phương thức này trả về đầu ra giống như lệnh gọi PASSWORD () trong MySQL. Tôi hy vọng điều này sẽ giúp ích cho bạn.
Chỉnh sửa:Đây là mã tương tự trong C #
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();
}