Оглавление |
---|
Введение
В статье описана методика генерации хеша пароля по алгоритму защиного преобразования ГОСТ Р 34.11-2012. Хеш генерируется в формате файла /etc/shadow. Формат генерируемого хеша:
...
- код_алгоритма_хеширования — в данном примере используется gost12512hash;
- модификатор_входа — последовательность случайных символов, добавляемая к хешируемым данным (паролю) для предотвращения декодирования методом перебора , далее "соль"(соль, salt). Далее в примерах используется соль 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 |
Генерация хеша пароля по алгоритму ГОСТ Р 34.11-2012
...
с помощью функции gost12_512_crypt()
Установка пакетов
Для сборки программы требуется установить компилятор gcc (пакет gcc). Для установки пакета gcc в ALSE x.7 требуется подключить базовый репозиторий, в более ранних обновлениях Astra Linux Special 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( "saltpass=%s passsalt=%s hash=%s\n", pass, salt, hash); return 0; } |
Command |
---|
gcc hash.c /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 |