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 個字元)。若要針對 $apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
驗證 myPassword
,執行以下動作:
$ openssl passwd -apr1 -salt r31..... myPassword
$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
SHA1 變體可能是 DBD 身分驗證最實用的格式。由於 SHA1 和 Base64 函式非常普遍,其他軟體可以使用 Apache 基本身分驗證可用的已加密密碼填充資料庫。
在各種語言中建立 Apache SHA1-variant 基本身分驗證密碼
'{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')