Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Symulacja szyfrowania password() w MySql przy użyciu .NET lub MS SQL

Według dokumentacji MySQL algorytm jest podwójnym hashem SHA1. Podczas badania kodu źródłowego MySQL można znaleźć funkcję o nazwie make_scrambled_password() w libmysql/password.c. Funkcja jest zdefiniowana w następujący sposób:

/*
    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);
}

Biorąc pod uwagę tę metodę, możesz utworzyć odpowiednik .NET, który zasadniczo robi to samo. Oto, co wymyśliłem. Kiedy uruchamiam SELECT PASSWORD('test'); w stosunku do mojej lokalnej kopii MySQL, zwracana wartość to:

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

Zgodnie z kodem źródłowym (ponownie w password.c) początkowa gwiazdka wskazuje, że jest to metoda szyfrowania hasła stosowana w post-MySQL 4.1. Kiedy emuluję funkcjonalność na przykład w VB.Net, wymyślam to:

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

Należy pamiętać, że SHA1Managed() znajduje się w przestrzeni nazw System.Security.Cryptography. Ta metoda zwraca te same dane wyjściowe, co wywołanie PASSWORD() w MySQL. Mam nadzieję, że to ci pomoże.

Edycja:oto ten sam kod w 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. Funkcja MySQL POW() – podnieś wartość do potęgi innej wartości

  2. MySQL (lub PHP?) grupuje wyniki według danych pola

  3. przesyłanie obrazów na serwer wiosną MVC i przechowywanie referencji w bazie mysql

  4. Dlaczego Hibernate nie tworzy bazy danych dla MySQL?

  5. Klauzula UNIA MySQL