MySQL では、パスワードのハッシュ値を指定してユーザを作ることが出来ます。
mysql> SELECT authentication_string FROM mysql.user WHERE User = 'usr'; +-------------------------------------------+ | authentication_string | +-------------------------------------------+ | *9DE95B4999920AF052A4DC2BC3D229D4E9D1B676 | +-------------------------------------------+ 1 row in set (0.00 sec)
mysql> CREATE USER usr@'localhost' IDENTIFIED BY PASSWORD '*9DE95B4999920AF052A4DC2BC3D229D4E9D1B676'; Query OK, 0 rows affected, 1 warning (0.00 sec)
この方法は複数のデータベースに同一のパスワードでユーザを作成する時に便利です。
ユーザ作成は、データベース管理者が仮パスワードでユーザを作成し、本人がパスワードを変更する流れが一般的だと思います。 仮パスワードの発行とパスワード変更を複数のデータベースで行うのは面倒です。最初のデータベースだけこの流れでパスワードを設定し、残りはハッシュ値をコピーすれば手間を省けます*1。
また、平文のパスワードを含むSQLは取り扱いに非常に注意が必要ですが、ハッシュ値であれば、気軽に取り扱える点もメリットです。
IDENTIFIED BY PASSWORD〜構文が8.0で廃止された
上記のIDENTIFIED BY PASSWORD
構文 はMySQL 5.7 のものです。deprecated
になっており廃止が予告されていました。
8.0 からは、IDENTIFIED WITH auth_plugin AS ハッシュ値(authentication_string)
に構文が変わっています。
mysql> CREATE USER 'usr'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035241F53216C28304B071C573A37015F252C54631B66446E7064626471444E51683766426336377635585A756E6E7A442E497339716942596A2E6D7755514A4C38
ハッシュ値は、mysql.user
テーブルもしくは SHOW CREATE USER
で確認できます。
mysql> SELECT authentication_string FROM mysql.user WHERE User = 'usr'; +------------------------------------------------------------------------+ | authentication_string | +------------------------------------------------------------------------+ | $A$005$S!l(0KW:7_%,TcDnpdbdqDNQh7fBc67v5XZunnzD.Is9qiBYj.mwUQJL8 | +------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SHOW CREATE USER usr@'localhost' \G *************************** 1. row *************************** CREATE USER for usr@localhost: CREATE USER 'usr'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$S!l(0KW:7_%,TcDnpdbdqDNQh7fBc67v5XZunnzD.Is9qiBYj.mwUQJL8' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT 1 row in set (0.00 sec)
また、ハッシュ値は16進数で指定することも可能になっています。authentication_string
にバイナリが入る可能性を考慮しているのでしょう。
16進数の表記は、print_identified_with_as_hex
を on
で確認できます。
mysql> SET print_identified_with_as_hex = on; Query OK, 0 rows affected (0.00 sec) mysql> SHOW CREATE USER usr@'localhost' \G *************************** 1. row *************************** CREATE USER for usr@localhost: CREATE USER 'usr'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035241F53216C28304B071C573A37015F252C54631B66446E7064626471444E51683766426336377635585A756E6E7A442E497339716942596A2E6D7755514A4C38 REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT 1 row in set (0.00 sec)