Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mensimulasikan enkripsi kata sandi () MySql menggunakan .NET atau MS SQL

Menurut dokumentasi MySQL, algoritme adalah hash SHA1 ganda. Saat memeriksa kode sumber MySQL, Anda menemukan fungsi yang disebut make_scrambled_password() di libmysql/password.c. Fungsi didefinisikan sebagai berikut:

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

Dengan metode ini, Anda dapat membuat mitra .NET yang pada dasarnya melakukan hal yang sama. Inilah yang saya dapatkan. Ketika saya menjalankan SELECT PASSWORD('test'); terhadap salinan lokal MySQL saya, nilai yang dikembalikan adalah:

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

Menurut kode sumber (sekali lagi di password.c), tanda bintang awal menunjukkan bahwa ini adalah metode pasca-MySQL 4.1 untuk mengenkripsi kata sandi. Ketika saya meniru fungsionalitas di VB.Net misalnya, inilah yang saya dapatkan:

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

Ingatlah bahwa SHA1Managed() ada di namespace System.Security.Cryptography. Metode ini mengembalikan output yang sama dengan panggilan PASSWORD() di MySQL. Saya harap ini membantu Anda.

Sunting:Ini kode yang sama di 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. Permintaan tabel pivot MySQL dengan kolom dinamis

  2. Menemukan postingan dengan tag1 DAN tag2? (menggunakan tabel gabungan) Ada / Memiliki / subqueries... Apa yang harus digunakan?

  3. Menggambar Banyak Poligon di Google Maps API v3 dari database MySQL

  4. MySQL:Tidak dapat memberi nama tabel dalam Kasus Unta Atas (Kasus Pascal)

  5. Urutan pencarian teks lengkap MYSQL berdasarkan relevansi