TL;DR
version | passwordカラム(CHAR(41) NOT NULL) | authentication_stringカラム(TEXT NULL) | pluginカラム | 認証プラグインの選択 |
---|---|---|---|---|
5.0.96 | パスワードハッシュ | カラムなし | カラムなし | ダイジェスト長 |
5.1.73 | パスワードハッシュ | カラムなし | カラムなし | ダイジェスト長 |
5.5.62 | パスワードハッシュ | 常に空文字 | 認証プラグイン | pluginカラム、空文字列の場合はダイジェスト長 |
5.6.42 | SHA256プラグイン以外のパスワードハッシュ | SHA256プラグインの時のパスワードハッシュ | 認証プラグイン | pluginカラム、空文字列の場合はダイジェスト長 |
5.7.24 | カラムなし | パスワードハッシュ | 認証プラグイン | pluginカラムのみ |
8.0.13 | カラムなし | パスワードハッシュ | 認証プラグイン | pluginカラムのみ |
日々の覚書: MySQL 5.7.6でmysql.userテーブルのパスワードのカラム名がなんか変わった で「MySQL 5.7ではパスワードハッシュが格納されるカラムが
password
から authentication_string
に変更になった」としていたけれど、ちょっと調べてみたらなんかそれなりに歴史的経緯っぽいものがありました。- 旧来(MySQL 5.0, 5.1)は2種類の認証プラグイン(
mysql_native_password
= 俗称41桁ハッシュ、mysql_old_password
= 俗称16桁ハッシュ) があったが、それを識別するためのplugin
カラムは無く、「クライアントから送られてきたダイジェストの長さ」でどちらのプラグインを使うか決めてpassword
カラムに入っているパスワードハッシュを引き出して使っていた - MySQL 5.5から
plugin
カラムが追加される。これは5.5で「認証プラグインAPI」を解放した時に一緒に実装されたのだと思う。- MySQL :: MySQL 5.5 Reference Manual :: 6.5.1 Authentication Plugins
- たぶん過渡期の例外措置として、
plugin
が空文字ならば旧来と同じダイジェストの長さによってmysql_native_password
とmysql_old_password
を打ち分ける実装になっている authentication_string
カラムも実装されたけど、この時点でこのカラムを使っているっぽい認証プラグインは少なくともコミュニティー版のソースコード上にはない。
- MySQL 5.6では商用版限定ながら
sha256_password
プラグインが登場する。- MySQL :: MySQL 5.6 Reference Manual :: 6.5.1.4 SHA-256 Pluggable Authentication
- MySQL 8.0では同じ名前の
sha256_password
プラグインがコミュニティー版でも使えるようになった。実装まで同じかどうかは知らない。
- MySQL 8.0では同じ名前の
- MySQL 8.0の
sha256_password
プラグインと同じものだとすると、パスワードハッシュが$5$
から始まる66桁になるので、Password CHAR(41) NOT NULL
には入らずAuthentication_string TEXT
に入れることになったのかなpassword
カラムの長さを変えるのはリスキーだなって感じで
- MySQL :: MySQL 5.6 Reference Manual :: 6.5.1.4 SHA-256 Pluggable Authentication
- MySQL 8.0では
sha256_password
と同じく256bitのSHA2を使うcache_sha2_password
がデフォルトになるのもあって、この時点までにpassword
カラムがなくなってauthentication_string
に一本化されるのは確定だっただろうから、ちょっと前倒ししてMySQL 5.7で消すことにしたんじゃないかなと思う。
動作とかの部分はそれなりに調べたけど、経緯の部分は想像しているだけで裏付けとかはないです。