Форматы паролей
Сведения о форматах шифрования паролей, которые создаёт и распознаёт Apache.
Базовая аутентификация
Для паролей базовой аутентификации Apache распознаёт пять форматов. Обратите внимание, что не все форматы работают на каждой платформе:
- bcrypt
- "$2y$" + результат алгоритма crypt_blowfish. Подробное описание алгоритма см. в исходном файле APR crypt_blowfish.c.
- MD5
- "$apr1$" + результат специфичного для Apache алгоритма, использующего хеш MD5, вычисленный итеративно (1 000 раз) для различных комбинаций случайной 32-битной соли и пароля. Подробное описание алгоритма см. в исходном файле APR apr_md5.c.
- SHA1
- "{SHA}" + хеш SHA-1 пароля в кодировке Base64. Небезопасен.
- CRYPT
- Только Unix. Использует традиционную функцию Unix
crypt(3)со случайно сгенерированной 32-битной солью (используются только 12 бит) и первыми 8 символами пароля. Небезопасен. - ОТКРЫТЫЙ ТЕКСТ (т. е. незашифрованный)
- Только Windows и Netware. Небезопасен.
Создание значений с помощью htpasswd
bcrypt
$ htpasswd -nbB myName myPassword myName:$2y$05$c4WoMPo3SXsafkva.HHa6uXQZWr7oboPiC2bT/r7q1BB8I2s0BRqC
MD5
$ htpasswd -nbm myName myPassword myName:$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
SHA1
$ htpasswd -nbs myName myPassword
myName:{SHA}VBPuJHI7uixaa6LQGWx4s+5GKNE=
CRYPT
$ htpasswd -nbd myName myPassword myName:rqXexS6ZhobKA
Создание значений CRYPT и MD5 с помощью программы командной строки OpenSSL
OpenSSL поддерживает специфичный для Apache алгоритм MD5.
MD5
$ openssl passwd -apr1 myPassword $apr1$qHDFfhPC$nITSVHgYbDAK1Y0acGRnY0
CRYPT
openssl passwd -crypt myPassword qQ5vTYO3c8dsU
Проверка паролей CRYPT или MD5 с помощью программы командной строки OpenSSL
Соль пароля CRYPT — это первые два символа (преобразованные в двоичное значение). Чтобы проверить myPassword на соответствие rqXexS6ZhobKA
CRYPT
$ 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/
MD5
$ openssl passwd -apr1 -salt r31..... myPassword $apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
Поля паролей базы данных для mod_dbd
Вариант SHA1, вероятно, является наиболее полезным форматом для аутентификации DBD. Поскольку функции SHA1 и Base64 широко доступны, другое программное обеспечение может заполнять базу данных зашифрованными паролями, которые можно использовать для базовой аутентификации Apache.
Создание паролей базовой аутентификации Apache с вариантом SHA1 на разных языках:
PHP
'{SHA}' . base64_encode(sha1($password, TRUE))
Java
"{SHA}" + new sun.misc.BASE64Encoder().encode(java.security.MessageDigest.getInstance("SHA1").digest(password.getBytes()))
ColdFusion
"{SHA}" & ToBase64(BinaryDecode(Hash(password, "SHA1"), "Hex"))
Ruby
require 'digest/sha1'
require 'base64'
'{SHA}' + Base64.encode64(Digest::SHA1.digest(password))
C или C++
Use the APR function: apr_sha1_base64
Python
import base64
import hashlib
"{SHA}" + format(base64.b64encode(hashlib.sha1(password).digest()))
PostgreSQL (с установленными функциями contrib/pgcrypto)
'{SHA}'||encode(digest(password,'sha1'),'base64')
Аутентификация Digest
Для паролей аутентификации Digest Apache распознаёт один формат — MD5-хеш строки user:realm:password в виде 32-символьной строки шестнадцатеричных цифр. realm — это аргумент Authorization Realm директивы AuthName в httpd.conf.
Поля паролей базы данных для mod_dbd
Поскольку функция MD5 широко доступна, другое программное обеспечение может заполнять базу данных зашифрованными паролями, которые можно использовать для аутентификации Digest Apache.
Создание паролей аутентификации Digest Apache на разных языках:
PHP
md5($user . ':' . $realm . ':' .$password)
Java
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
ColdFusion
LCase(Hash( (user & ":" & realm & ":" & password) , "MD5"))
Ruby
require 'digest/md5' Digest::MD5.hexdigest(user + ':' + realm + ':' + password)
PostgreSQL (с установленными функциями contrib/pgcrypto)
encode(digest( user || ':' || realm || ':' || password , 'md5'), 'hex')
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/misc/password_encryptions.html