<link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=2360036927927948032&amp;zx=e91c0c17-e3f4-4dfa-bcc9-f72dc220b6ab' rel='stylesheet'/>

2018年10月30日火曜日

mysql.userテーブルの認証周りのカラムあれこれ

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_passwordmysql_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の sha256_password プラグインと同じものだとすると、パスワードハッシュが $5$ から始まる66桁になるので、 Password CHAR(41) NOT NULL には入らずAuthentication_string TEXT に入れることになったのかな
      • password カラムの長さを変えるのはリスキーだなって感じで
  • MySQL 8.0では sha256_password と同じく256bitのSHA2を使う cache_sha2_password がデフォルトになるのもあって、この時点までに password カラムがなくなって authentication_string に一本化されるのは確定だっただろうから、ちょっと前倒ししてMySQL 5.7で消すことにしたんじゃないかなと思う。
動作とかの部分はそれなりに調べたけど、経緯の部分は想像しているだけで裏付けとかはないです。

0 件のコメント :

コメントを投稿