你在配 Redis 密码、改 Nginx 的 basic_auth 用户文件,或者写 Docker Compose 里带密码的服务时,有没有遇到过要求填 password_hash 或者提示‘请使用 bcrypt/sha256 加密’?这时候,哈希加密算法就不是教科书里的概念了,而是你敲命令时必须搞定的实际步骤。
哈希不是加密,别乱解密
先划重点:哈希是单向的。比如你输 admin123,用 SHA-256 算出一串 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918,这串字符没法反推回去。所以系统存的永远是哈希值,登录时拿你输的密码再算一次,比对结果是否一致——这是绝大多数软件做密码校验的底层逻辑。
常见场景和命令行实操
Linux 下配 Apache 或 Nginx 的 htpasswd 文件,常用 bcrypt:
htpasswd -B -c /etc/nginx/.htpasswd user1
它会提示你输入密码,然后生成类似这样的行:user1:$2y$10$RZVQzQkWJqKjLzYwXlDdIeGvHgOvUQrT1FtN7sA5vCmP9bJ2rKjQq
Python 项目里用 Flask-Login 或 FastAPI 做用户认证,常调用 passlib:
from passlib.hash import pbkdf2_sha256
hash = pbkdf2_sha256.hash("my_secret")
输出形如:pbkdf2-sha256$29000$...,这种带盐(salt)和迭代次数的哈希更抗暴力破解。
选哪个算法?看软件文档
别硬套“最安全”的名字。PostgreSQL 的 pg_hba.conf 支持 md5(注意:不是密码明文 MD5,而是 md5(password + username)),但新版也支持 scram-sha-256;Docker Registry v2 要求 bcrypt;而一些嵌入式设备 Web 界面只认 SHA-1(虽然不推荐,但得适配)。翻一眼你正在配的软件的官方 config 示例,比查算法排名管用得多。
避坑提醒
• 不要用 echo 'pwd' | md5sum 直接当密码哈希——缺 salt,彩虹表一扫一个准;
• 配置文件里别手写哈希值后多敲一个空格或换行,有些服务(如 Traefik)会校验失败;
• Node.js 项目里如果用 crypto.createHash('sha256').update(pwd).digest('hex'),记得确认目标服务是否接受纯 SHA-256——多数现代服务要的是带 salt 的自适应哈希(bcrypt/scrypt/argon2)。