Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mô phỏng mã hóa mật khẩu () của MySql bằng .NET hoặc MS SQL

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();
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đang điền danh sách thả xuống - PHP Ajax MySQL

  2. Làm cách nào để loại bỏ tất cả các bảng khỏi cơ sở dữ liệu với management.py CLI trong Django?

  3. Chuyển đổi ngày từ yyyy-mm-dd sang dd month_name năm

  4. Kết nối mysql từ xa qua máy chủ miễn phí

  5. Toán tử so sánh MySQL, dấu cách