Оглавление |
---|
Введение
В статье описана методика генерации хеша пароля формате файла /etc/shadow.
Формат генерируемого хеша (в качестве разделителей полей используется символ "$" ("доллар"):
Блок кода |
---|
$<код_алгоритма_хеширования>$<модификатор_входа>$<хеш_пароля> |
- Где:
- $gost12512hash$saltsaltsaltsalt$Y.AHSfY6w10hNisNhRQkl3YuAexXkTWxDAI2sipxMVG.wVHgZ5czD2wX2zMpptQEu2Wpfuo7DiAKDxDWe/IjS0
- код_алгоритма_хеширования — в данном примере используется gost12512hash;
- модификатор_входа — последовательность символов, добавляемая к хешируемым данным (паролю) для предотвращения декодирования методом перебора, далее "соль". Далее в примерах используется соль saltsaltsaltsalt;
- хеш_пароля — собственно хеш пароля, полученный после добавления соли.
Для генерации хеша используется функция gost12_512_crypt() входящая в состав пакета libgost. Пакет libgost устанавливается в Astra Linux по умолчанию. Далее предполагается, что при установке пакета библиотека libgost.so размещена в файле /lib/libgost.so.2.0.2 (актуально для Astra Linux x.7, 1.6.12, 2.12.46). Проверить, где находится библиотека в используемом обновлении можно командой:
Command |
---|
dpkg -L libgost |
Генерация хеша пароля по алгоритму ГОСТ-2012-512 с помощью функции gost12_512_crypt()
Установка пакетов
Для сборки программы требуется установить компилятор gcc (пакет gcc). Для установки пакета gcc в ALSE x.7 требуется подключить базовый репозиторий, в более ранних обновлениях Astra Linux Special Edition требуется подключить диск со средствами разработки, в Astra Linux Common Edition пакет может быть установлен :
Command |
---|
sudo apt install gcc |
Генерация хеша пароля по алгоритму ГОСТ-2012-512 с помощью функции gost12_512_crypt()
Пример программы генерации:
Блок кода | ||
---|---|---|
| ||
#include <stdio.h>
// Объявление функции генерации пароля.
// Первый аргумент - пароль, второй аргумент - соль
extern char *gost12_512_crypt (const char *pass, const char *salt); // объявление функции генерации пароля. 1-
const char *pass = "q2w2e2r2"; // пароль
const char *salt = "saltsaltsaltsalt"; // "соль"
int main( int argc, char **argv) {
char *hash = gost12_512_crypt( pass, salt);
if( !hash) {
fprintf( stderr, "Failed %m\n");
return 1;
}
printf( "salt=%s pass=%s hash=%s\n", pass, salt, hash);
return 0;
} |
Command |
---|
gcc /lib/libgost.so.2.0.2 hash.c |
Блок кода |
---|
./a.out
salt=q2w2e2r2 pass=saltsaltsaltsalt hash=$gost12512hash$saltsaltsaltsalt$Y.AHSfY6w10hNisNhRQkl3YuAexXkTWxDAI2sipxMVG.wVHgZ5czD2wX2zMpptQEu2Wpfuo7DiAKDxDWe/IjS0 |
Генерация хеша пароля по алгоритму ГОСТ-2012-512 с помощью функции gost12_512_crypt() в Python
Установка пакетов
Для генерации хеша пароля по алгоритму ГОСТ-2012-512 с помощью функции gost12_512_crypt() в Python установка дополнительных пакетов не требуется.
Пример программы
Пример программы:
Блок кода | ||
---|---|---|
| ||
#!/usr/bin/python3
import base64, ctypes, getpass, os, sys
def gost12_512_crypt(key, salt):
libgost = ctypes.cdll.LoadLibrary("/lib/libgost.so.2.0.2")
libgost.gost12_512_crypt.argtypes = (
ctypes.c_char_p,
ctypes.c_char_p,
)
libgost.gost12_512_crypt.restype = ctypes.c_void_p
c_void_ptr = libgost.gost12_512_crypt(key.encode(), salt.encode())
c_result = ctypes.cast(c_void_ptr, ctypes.c_char_p)
return c_result.value.decode()
if __name__ == "__main__":
salt = (
sys.argv[1]
if len(sys.argv) > 1
else base64.urlsafe_b64encode(os.urandom(12)).decode("ascii").rstrip("=")
)
print(gost12_512_crypt(getpass.getpass(), salt)) |
Блок кода |
---|
python3 hash.py saltsaltsaltsalt
Password:
$gost12512hash$saltsaltsaltsalt$Y.AHSfY6w10hNisNhRQkl3YuAexXkTWxDAI2sipxMVG.wVHgZ5czD2wX2zMpptQEu2Wpfuo7DiAKDxDWe/IjS0 |
Show If | ||
---|---|---|
| ||
Структура пароляmd5: <pass><magic><salt><pass> |
Предупреждение |
---|
Статья не для передачи заказчикам. |
Оглавление |
---|
...
Создание случайной солиВозможные варианты создания случайной соли (стандартно используется длина соли 16):
Получение чистого хеша пароляsudo apt install libgost-astra echo Пароль | openssl -md_gost12_512 Хеш пароля с солью по ГОСТ 2012.252 в формате /etc/shadowsudo apt install -y libgost-astra salt=`openssl rand -base64 16 | head -c 16` ; echo $salt hash=`echo -n "${salt}q2w2e2r2" | openssl dgst -md_gost12_512 | awk '{print $2}'` ; echo $hash hash=`echo -n "${salt}q2w2e2r2" | openssl dgst -sha512 | awk '{print $2}'` ; echo $hash sudo sed -i "s/^luser:[^:]*/luser:${shadow//\//\\/}/" /etc/shadow ; sudo grep luser /etc/shadow salt="/Ew6fLFg4kxS5Ii."
echo -n "`openssl rand -base64 16 | head -c 16`Пароль" | openssl dgst -md_gost12_512 | sed "s/^.*= /\$gost12512hash\$/" echo -n "`openssl rand -base64 16 | head -c 16`Пароль" | gostsum --gost-2012-512 |