sql >> Databáze >  >> RDS >> Mysql

Simulace šifrování MySql password() pomocí .NET nebo MS SQL

Podle dokumentace MySQL je algoritmem dvojitý hash SHA1. Při zkoumání zdrojového kódu MySQL najdete funkci nazvanou make_scrambled_password() v libmysql/password.c. Funkce je definována následovně:

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

Díky této metodě můžete vytvořit protějšek .NET, který v podstatě dělá to samé. Tady je to, na co jsem přišel. Když spustím SELECT PASSWORD('test'); proti mé místní kopii MySQL je vrácená hodnota:

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

Podle zdrojového kódu (opět v password.c) počáteční hvězdička označuje, že se jedná o post-MySQL 4.1 metodu šifrování hesla. Když emuluji funkce například ve VB.Net, přicházím s tímto:

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

Mějte na paměti, že SHA1Managed() je v oboru názvů System.Security.Cryptography. Tato metoda vrací stejný výstup jako volání PASSWORD() v MySQL. Doufám, že vám to pomůže.

Edit:Zde je stejný kód v 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. Jak resetuji sekvenci v Oracle?

  2. Jak změnit barvu a písma v SQL Server Management Studio (SSMS) - SQL Server / TSQL výukový program, část 12

  3. Automatizace kontroly objektu schématu databáze

  4. Generování syntetických dat