piapia123
zh

PostgreSQL / MySQL / MariaDB 密码哈希

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

算出三种数据库「密码字段里存的到底是什么」。这三种写法今天都不该用于新系统 —— PostgreSQL 的 md5 方案没有迭代、一次 md5 就能算完;MySQL 的 `PASSWORD()` 已经被官方移除、双重 SHA-1 也早已不够 —— 但它们仍然躺在无数 `pg_authid`、`mysql.user` 表和各处的初始化脚本里。要把一个用户从旧库迁到新库、或者手工修一条记录时,就得能算出这个值。PostgreSQL 那一条尤其要注意:它把用户名当盐用(哈希 = md5(密码 + 用户名)),所以同一个密码配不同的用户名得到的哈希完全不同 —— 迁移时把哈希原样搬到另一个用户名下,登录必然失败。

功能

  • 三种方言:PostgreSQL 的 md5、MySQL 与 MariaDB 的 mysql_native_password
  • PostgreSQL 按「密码 + 用户名」计算 —— 并说明为什么用户名不能填错
  • 每种方言都给出一条可直接跑的 SQL(ALTER USER / SET PASSWORD)
  • 哈希与 SQL 分行显示,各自可以单独复制
  • 中文密码按 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 的大写十六进制。要给 8.0 的用户设置它,用 `IDENTIFIED WITH mysql_native_password AS '…'` —— 本工具给出的 SQL 正是这一句。
这些写法安全吗?
都不安全,都不该用于新系统。PostgreSQL 的 md5 方案只做一次 md5,没有任何迭代,现代显卡每秒能算上百亿次;MySQL 的双重 SHA-1 虽然多了一层,但也远达不到「慢哈希」的强度。真正的问题是它们不加盐(PostgreSQL 那点的「盐」就是用户名,既公开又固定),所以彩虹表直接可用。新系统请用 bcrypt、scrypt 或 Argon2id —— 站内都有对应工具。本工具存在的意义是迁移,不是新建。

相关工具