MySQLプロトコル-python版パスワード解読


0 x 00概要
MySQLユーザーアカウントはmysqlデータベースのuserテーブルにリストされます.MySQLアカウントごとにパスワードを指定します.userテーブルPassword列に保存されているパスワードは明文ではありませんが、ハッシュ値はテーブルのレコードから計算されます.パスワードのハッシュ値はPASWORD()関数で計算されます.
MySQLは、クライアント/サーバ通信の2段階でパスワードを使用します.
・クライアントがサーバに接続しようとすると、初期認証ステップがあり、クライアントはパスワードを提供し、ユーザが使用したいアカウントがuserテーブルに保存したハッシュ値と一致しなければならない.
・クライアント接続後、userテーブルにリストされているアカウントのパスワードハッシュ値を設定または変更できます(十分な権限がある場合).クライアントは、PASWORD()関数を使用してパスワードハッシュ値を生成したり、GRANTまたはSET PASWORD文を使用したりすることができます.
本稿では、MySQLデータベースで使用される2つの異なるハッシュ暗号化方法について説明します.4.1バージョン以降、MySQLのハッシュアルゴリズムはすでに完備しています.
0 x 01 MySQL Pre-4.1バージョンハッシュメソッド
MySQL 4.1以前、データベースに保存されていたpasswordハッシュは、PASSWORD()関数によって算出された16バイトの長さの文字列であり、例は以下の通りである.
mysql_3.23> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e   |
+--------------------+

この暗号化方式を「mysql 323」と呼ぶ人もいるが、卵用はない.以前のブログで紹介した認証方式のようにmysql 323のハッシュ長は16バイトしかないため、binaryに変換すると8バイトになり、衝突によって解読されやすい.2000年ごろから徐々に歴史の舞台を脱退している.
0 x 01 MySQL 4.1以降のハッシュメソッド
mysql 323の不足に基づいて、開発者は新しいハッシュアルゴリズムを設計した.
  • より複雑なPASWORD()関数
  • 増加Passwordハッシュ値格納長
  • デフォルトハッシュメソッドの調整
  • リモート接続認証を調整するハッシュメソッド
  • passwordハッシュ値は*でMySQL 4で開始する.1では、ハッシュメソッドは41バイトの長さのハッシュ値を計算してデータベースに保存します.もちろん、41=40+1のこの1は*文字です.例は次のとおりです.
  • mysql> SELECT PASSWORD('mypass');
    +-------------------------------------------+
    | PASSWORD('mypass')                        |
    +-------------------------------------------+
    | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +-------------------------------------------+
    

    柄は多くないが、長さが倍になるという簡単で乱暴な補強案だ.アルゴリズム:
  • password 2回sha 1
  • pythonコード:
    import hashlib
    hash1 = hashlib.sha1(passwd).digest()
    reuslt = hashlib.sha1(hash1).hexdigest()
    #      6c8989366eaf75bb670ad8ea7a7fc1176a95cef4
    print reuslt 
    

    mysqlコマンド:
    mysql> SELECT SHA1(UNHEX(SHA1("mypass")));
    
    +------------------------------------------+
    | SHA1(UNHEX(SHA1("mypass")))              |
    +------------------------------------------+
    | 6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
    +------------------------------------------+
    1 row in set (0.00 sec)
    

    0 x 02余談
    以下は初歩的な判断で、mysql 5.6以上のバージョンを使ったことがありません.MySQL 5.6バージョンでリモート認証プロセスを開始したベースハッシュはsha 256に変更され、データベースに保存されたハッシュ値はsha 1の結果です.
    0 x 03 MySQL pre-4.1ハッシュ解読コード
    pre-4.1のハッシュが弱すぎて衝突しやすいため、外国人がCVE、番号CVE-2000-0981を提案し、比較的詳細な研究報告「転送ドア」があり、興味のある学生は見ることができます.
    また、解読したpocソース【トランスポートゲート】が付属しています
    0 x 04参考文献
    https://blog.csdn.net/paul123456789io/article/details/53081921 https://stackoverflow.com/questions/5654819/how-can-i-decrypt-mysql-passwords http://www.iteedu.com/database/mysql/mysqlmanualcn/database-administration/password-hashing.php https://dev.mysql.com/doc/refman/5.6/en/sha256-pluggable-authentication.html https://dev.mysql.com/doc/refman/5.6/en/set-password.html