Mysql
 sql >> Base de données >  >> RDS >> Mysql

Simulation du cryptage du mot de passe () de MySql à l'aide de .NET ou de MS SQL

Selon la documentation de MySQL, l'algorithme est un double hachage SHA1. Lors de l'examen du code source de MySQL, vous trouvez une fonction appelée make_scrambled_password() dans libmysql/password.c. La fonction est définie comme suit :

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

Avec cette méthode, vous pouvez créer un équivalent .NET qui fait essentiellement la même chose. Voici ce que j'ai trouvé. Lorsque j'exécute SELECT PASSWORD('test'); par rapport à ma copie locale de MySQL, la valeur renvoyée est :

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

Selon le code source (toujours dans password.c), l'astérisque de début indique qu'il s'agit de la méthode post-MySQL 4.1 de cryptage du mot de passe. Lorsque j'émule la fonctionnalité dans VB.Net par exemple, voici ce que j'obtiens :

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

Gardez à l'esprit que SHA1Managed() se trouve dans l'espace de noms System.Security.Cryptography. Cette méthode renvoie la même sortie que l'appel PASSWORD() dans MySQL. J'espère que cela vous aidera.

Edit :Voici le même code en 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();
}