Mysql
 sql >> база данни >  >> RDS >> Mysql

Симулиране на паролата() на MySql с помощта на .NET или MS SQL

Според документацията на MySQL алгоритъмът е двоен SHA1 хеш. Когато разглеждате изходния код на MySQL, намирате функция, наречена make_scrambled_password() в libmysql/password.c. Функцията се дефинира, както следва:

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

Като се има предвид този метод, можете да създадете .NET аналог, който по същество прави същото. Ето какво измислих. Когато стартирам SELECT PASSWORD('test'); срещу моето локално копие на MySQL, върнатата стойност е:

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

Според изходния код (отново в password.c), началната звездичка показва, че това е методът за криптиране на паролата след MySQL 4.1. Когато емулирам функционалността във VB.Net например, ето какво измислям:

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

Имайте предвид, че SHA1Managed() е в пространството от имена System.Security.Cryptography. Този метод връща същия изход като извикването PASSWORD() в MySQL. Надявам се това да ви помогне.

Редактиране:Ето същия код в 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. Как да добавя още членове към моята колона от тип ENUM в MySQL?

  2. Кога да извикам bind_param, ако използвам MySQLi подготвени оператори в цикъл?

  3. Как да премина през MySQL заявка чрез PDO в PHP?

  4. Изисква се пролетно зареждане CLIENT_PLUGIN_AUTH

  5. Оттеглено разширение MySQL в PHP 5.5.x