sql >> データベース >  >> RDS >> Mysql

.NETまたはMSSQLを使用したMySqlのpassword()暗号化のシミュレーション

    MySQLのドキュメントによると、アルゴリズムはダブルSHA1ハッシュです。 MySQLのソースコードを調べると、libmysql / password.cにmake_scrambled_pa​​ssword()という関数があります。関数は次のように定義されています:

    /*
        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にあります)によると、最初のアスタリスクは、これがMySQL4.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名前空間にあることに注意してください。このメソッドは、MySQLのPASSWORD()呼び出しと同じ出力を返します。これがお役に立てば幸いです。

    編集:これは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. 等しくないクエリは機能しません

    2. PHP:警告:sort()は、パラメーター1が配列であり、リソースが指定されていることを想定しています。

    3. PythonとMySql:Unicodeとエンコーディング

    4. 接続された.mdfデータベースを使用するためのWeb.configのDB接続文字列が機能しない