MySQLを触ったことがある人なら、
MySQLプロトコルとは?
MySQLプロトコルは、
このプロトコルは、
MySQLプロトコルに関する詳細なドキュメントは、
また、
MySQLプロトコルの接続の流れ
MySQLプロトコルを使用したときの接続の流れは以下の様な流れを通ります。
- 最初にハンドシェイクパケットをサーバが投げて接続が開始される
- SSLを使用する場合はSSL接続のための処理を行う
- クライアントがハンドシェイクパケットを受けてレスポンスを返す
- サーバ側はクライアントから渡された認証用メソッドがあるかを調べる
(無かったら接続を閉じる) - 認証を行い、
問題がなければMySQLサーバ接続される
上記のようなフローを抜けて、
MySQLプロトコルのハンドシェイクパケット
今回はMySQLサーバをlocalhostに立てた状態でncatコマンドを利用して、
$ ncat -x dump localhost 3306
J
5.7.20
oP~Z*.G��!��~1XN~N[yeb;mysql_native_password
最後は入力待ちになってしまうので、
この時点で5.
表示した結果は以下の通りになります。
$ strings dump [0000] 4A 00 00 00 0A 35 2E 37 2E 32 30 00 0B 00 00 00 J....5.7 .20..... [0010] 6F 07 50 7E 5A 2A 2E 47 00 FF FF 21 02 00 FF C1 o.P~Z*.G ...!.... [0020] 15 00 00 00 00 00 00 00 00 00 00 7E 31 58 4E 7E ........ ...~1XN~ [0030] 4E 5B 17 79 65 62 3B 00 6D 79 73 71 6C 5F 6E 61 N[.yeb;. mysql_na [0040] 74 69 76 65 5F 70 61 73 73 77 6F 72 64 00 tive_pas sword.
読み方としては、
表示されているハンドシェイクパケットの値は、
| 名前 | 長さ | 説明 |
|---|---|---|
| protocol_ | 1byte | MySQLプロトコルのバージョン |
| server_ | 可変長で終端に0x00 | 人間が読める形のバージョン表記 |
| connection_ | 4byte | コネクションID |
| auth_ | 8byte | パスワードをhash化するための値その1 |
| filter_ | 1byte | フィルター |
| capability_ | 2byte | サーバがサポートしている機能 |
| character_ | 1byte | サーバのデフォルトのキャラクターセット |
| status_ | 2byte | サーバのステータス |
| capability_ | 2byte | サーバがサポートしている機能その2 |
| auth_ | 1byte | auth_ |
| reserved | 10byte | 予約されているバイト数 |
| auth-plugin-data-part-2 | (auth_ | パスワードをhash化するための値その2 |
| auth_ | 可変長で終端に0x00 | 認証に使うプラグインの名前 |
今回の例で行くと、protocol_が0AであることからMySQLプロトコルのバージョンが10であることがわかります。ターミナル上で5.
server_は35 2E 37 2E 32 30 00で 5.connection_は0B 00 00 00です。auth_には6F 07 50 7E 5A 2A 2E 47が入っています。その次のfilter_には固定値で00が入っているはずなので、
capability_はは少し特殊で、capability_と組み合わせて計算されます。それぞれFF FFとFF C1が該当します。
character_は、21なので10進数表記に戻すと33なのでutf8_が選択されていることがわかります。character setを検索したい場合は、SHOW COLLATION;で使える文字セットが一覧で確認できるので、
status_は、02 00なのでSERVER_が有効になっていることがここからわかります。
auth-plugin_は、15なので10進数表記に戻すと21なのでトータルで21バイトが使われることがわかります。つまりauth-plugin-data-part-2の長さは21-8=13バイトになることがわかります。最後にauth_が入り、mysql_プラグインが利用されていることがわかります。
これらのサーバから与えられた情報から必要な値を取り出して、
まとめ
今回はMySQLプロトコルの概要と、
普段MySQLを触っていてMySQLプロトコルを意識をすることはほぼ無いとは思いますが、