关于Apache生成和理解的密码加密格式的说明。
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
Warning: truncating password to 8 characters
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))
Use the APR function: apr_sha1_base64
import base64
import hashlib
"{SHA}" + format(base64.b64encode(hashlib.sha1(password).digest()))
'{SHA}'||encode(digest(password,'sha1'),'base64')
Apache识别一种摘要式身份验证密码格式-字符串的MD5哈希
user:realm:password
为32个字符的十六进制数字字符串。realm
是AuthName
httpd.conf中指令的Authorization Realm参数
。
由于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;
// String s is the encrypted password
LCase(Hash( (user & ":" & realm & ":" & password) , "MD5"))
require 'digest/md5'
Digest::MD5.hexdigest(user + ':' + realm + ':' + password)
encode(digest( user || ':' || realm || ':' || password , 'md5'), 'hex')