Apache HTTP Server 版本 2.4
Apache 识别五种基本身份验证密码格式。请注意,并非所有格式在所有平台上都适用。
crypt(3)
函数,并使用随机生成的 32 位盐(仅使用 12 位)和密码的前 8 个字符。不安全。$ htpasswd -nbB myName myPassword
myName:$2y$05$c4WoMPo3SXsafkva.HHa6uXQZWr7oboPiC2bT/r7q1BB8I2s0BRqC
$ htpasswd -nbm myName myPassword
myName:$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
$ htpasswd -nbs myName myPassword
myName:{SHA}VBPuJHI7uixaa6LQGWx4s+5GKNE=
$ htpasswd -nbd myName myPassword
myName:rqXexS6ZhobKA
OpenSSL 了解 Apache 特定的 MD5 算法。
$ openssl passwd -apr1 myPassword
$apr1$qHDFfhPC$nITSVHgYbDAK1Y0acGRnY0
openssl passwd -crypt myPassword
qQ5vTYO3c8dsU
CRYPT 密码的盐是前两个字符(转换为二进制值)。要验证 myPassword
与 rqXexS6ZhobKA
$ openssl passwd -crypt -salt rq myPassword
警告:密码截断为 8 个字符
rqXexS6ZhobKA
请注意,使用 myPasswo
而不是 myPassword
将产生相同的结果,因为 CRYPT 密码仅考虑前 8 个字符。
MD5 密码的盐位于 $apr1$
和后面的 $
之间(作为 Base64 编码的二进制值 - 最大 8 个字符)。要验证 myPassword
与 $apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
$ openssl passwd -apr1 -salt r31..... myPassword
$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
SHA1 变体可能是 DBD 身份验证最实用的格式。由于 SHA1 和 Base64 函数通常可用,因此其他软件可以填充包含 Apache 基本身份验证可用的加密密码的数据库。
要在各种语言中创建 Apache SHA1 变体基本身份验证密码
'{SHA}' . base64_encode(sha1($password, TRUE))
"{SHA}" + new sun.misc.BASE64Encoder().encode(java.security.MessageDigest.getInstance("SHA1").digest(password.getBytes()))
"{SHA}" & ToBase64(BinaryDecode(Hash(password, "SHA1"), "Hex"))
require 'digest/sha1'
require 'base64'
'{SHA}' + Base64.encode64(Digest::SHA1.digest(password))
使用 APR 函数:apr_sha1_base64
import base64
import hashlib
"{SHA}" + format(base64.b64encode(hashlib.sha1(password).digest()))
'{SHA}'||encode(digest(password,'sha1'),'base64')
Apache 识别一种摘要身份验证密码格式 - 字符串 user:realm:password
的 MD5 哈希,作为 32 个十六进制数字的字符串。realm
是 httpd.conf 中 AuthName
指令的授权域参数。
由于 MD5 函数通常可用,因此其他软件可以填充包含 Apache 摘要身份验证可用的加密密码的数据库。
要在各种语言中创建 Apache 摘要身份验证密码
md5($user . ':' . $realm . ':' .$password)
byte b[] = java.security.MessageDigest.getInstance("MD5").digest( (user + ":" + realm + ":" + password ).getBytes());
java.math.BigInteger bi = new java.math.BigInteger(1, b);
String s = bi.toString(16);
while (s.length() < 32)
s = "0" + s; // 字符串 s 是加密的密码
LCase(Hash( (user & ":" & realm & ":" & password) , "MD5"))
require 'digest/md5'
Digest::MD5.hexdigest(user + ':' + realm + ':' + password)
encode(digest( user || ':' || realm || ':' || password , 'md5'), 'hex')