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 字节计算
- 计算只在本机进行,密码不会上传
使用方法
- 选择数据库类型
- PostgreSQL 需要另外填用户名(它被当作盐)
- 把密码粘贴进输入框
- 复制哈希或那一行 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 —— 站内都有对应工具。本工具存在的意义是迁移,不是新建。
相关工具
Bcrypt 生成与验证
编码生成 bcrypt 密码哈希($2y$ 前缀)或验证密码与已有哈希是否匹配,成本因子可调,全部在浏览器本地完成。
Scrypt 生成与验证
编码生成 scrypt 密码哈希(PHC 格式)或验证已有哈希,参数可调,输出可选 PHC / 十六进制 / Base64,内存超预算时会明确提示。
哈希计算
编码算出文本的 MD5、SHA-1、SHA-256 或 SHA-512 摘要,也可算老系统用的 MD4 与 MD2,中文按 UTF-8 字节计算。全部在本地完成。
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。