piapia123
ja

PostgreSQL / MySQL / MariaDB のパスワードハッシュ

エンコード

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

3つのデータベースの「パスワード列に実際に何が入っているか」を計算します。これらの方式はいずれも新規システムに使うべきものではありません —— PostgreSQL の md5 は反復なしの md5 一回きり、MySQL の `PASSWORD()` は関数自体が削除され、二重 SHA-1 もとうに不十分です —— しかしそれらは今も無数の `pg_authid` や `mysql.user` の行、そして各地のセットアップスクリプトの中に残っています。ユーザーを旧データベースから移行する、あるいは1件のレコードを手で直すには、この値を計算できる必要があります。PostgreSQL の場合は特に注意が必要です:ユーザー名をソルトとして使うため(ハッシュ = md5(パスワード + ユーザー名))、同じパスワードでもユーザー名が違えばまったく別のハッシュになります。別のユーザー名の下にそのまま移すと、ログインは必ず失敗します。

機能

  • 3つの方言:PostgreSQL の md5、MySQL と MariaDB の mysql_native_password
  • PostgreSQL は「パスワード + ユーザー名」で計算 —— ユーザー名が重要な理由も明記
  • 各方言ごとに、そのまま実行できる SQL(ALTER USER / SET PASSWORD)を表示します
  • ハッシュと SQL は別の行に表示され、それぞれ個別にコピーできます
  • 非 ASCII のパスワードは UTF-8 バイトとして処理します
  • 計算は端末内で完結し、パスワードが送信されることはありません

使い方

  1. データベースを選びます
  2. PostgreSQL の場合はユーザー名を入力します(ソルトとして使われます)
  3. パスワードを入力欄に貼り付けます
  4. ハッシュ、または SQL の行をコピーします

よくある質問

PostgreSQL でユーザー名が必要なのはなぜですか?
`md5` 方式がユーザー名をソルトに使うからです:`md5` + md5(パスワード + ユーザー名)。利点はソルト用の列を別途保存しなくてよいこと、代償は名前を変えるとパスワードが無効になることです —— ハッシュを別のユーザー名の下へ移しても、内側の md5 には古い名前が混ざったままなので、ログインは失敗します。ユーザー移行時によく踏む罠で、本ツールが画面上に明記しているのはそのためです。
MySQL の PASSWORD() は削除されたはずですが、まだ使えますか?
MySQL 8.0 で `PASSWORD()` 関数は削除されましたが、`mysql_native_password` プラグイン自体は残っています(既定が `caching_sha2_password` に変わっただけです)。本ツールが計算するのはそのプラグインが期待する値、つまりアスタリスク + 二重 SHA-1 の大文字16進数です。MySQL 8.0 のユーザーに設定するには `IDENTIFIED WITH mysql_native_password AS '…'` を使います —— 本ツールが提示する SQL はまさにこれです。
これらの方式は安全ですか?
安全ではなく、新規システムには使えません。PostgreSQL の md5 は反復なしの md5 一回で、現代の GPU は毎秒数十億回を計算します。MySQL の二重 SHA-1 は層を1つ増やしていますが、意図的に遅くしたハッシュの強度には遠く及びません。より根本的な問題は、どちらも適切にソルトを付けていないことです(PostgreSQL の「ソルト」はユーザー名で、公開されており固定です)。レインボーテーブルがそのまま通用します。新規には bcrypt・scrypt・Argon2id を使ってください —— いずれも本サイトにツールがあります。本ツールは移行のためのもので、新規作成のためではありません。

関連ツール