Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление

Введение

В статье описана методика генерации хеша пароля  пароля по алгоритму защиного преобразования ГОСТ Р 34.11-2012. Хеш генерируется в формате файла /etc/shadow. Формат генерируемого хеша (в качестве разделителей полей используется символ "$" ("доллар"):

Блок кода
$<код_алгоритма_хеширования>$<модификатор_входа>$<хеш_пароля>

Где:

...

  • код_алгоритма_хеширования — в данном примере используется gost12512hash;
  • модификатор_входа — последовательность случайных символов, добавляемая к хешируемым данным (паролю) для предотвращения декодирования методом перебора , далее "соль"(соль, salt). Далее в примерах используется соль saltsaltsaltsalt;
  • хеш_пароля — собственно хеш пароля, полученный после добавления соли.

Разделителем между полями служит символ "$" (доллар). Например:

Блок кода
$gost12512hash$saltsaltsaltsalt$Y.AHSfY6w10hNisNhRQkl3YuAexXkTWxDAI2sipxMVG.wVHgZ5czD2wX2zMpptQEu2Wpfuo7DiAKDxDWe/IjS0

Для генерации хеша используется функция 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 требуется подключить диск репозиторий диска со средствами разработки,  в Astra Linux Common Edition пакет может быть установлен . Команда для установки:

Command

sudo apt install gcc

Генерация хеша пароля по алгоритму ГОСТ-2012-512 с помощью функции gost12_512_crypt()

Пример программы генерации:

Блок кода
languagecpp
#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;
}

Сборка программы (предполагается, что исходный текст сохранен в файле hach.c):

Command

gcc hash.c /lib/libgost.so.2.0.2 hash.c

В результате выполнения команды будет создан исполняемый файл a.out. Пример вызова и вывода исполняемого файла:

Блок кода
./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 установка дополнительных пакетов не требуется.

Пример программы

Пример программы:

Блок кода
languagepy
#!/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)) 

Предполагается, что программа сохранена в файле hash.py. "Соль" указывается как аргумент (если не указана - генерируется случайная). Пароль вводится в интерактивном режиме, вводимые символы не отображаются. Пример вызова и вывода программы:

Блок кода
python3 hash.py saltsaltsaltsalt
Password: 
$gost12512hash$saltsaltsaltsalt$Y.AHSfY6w10hNisNhRQkl3YuAexXkTWxDAI2sipxMVG.wVHgZ5czD2wX2zMpptQEu2Wpfuo7DiAKDxDWe/IjS0
Show If
useralevdonsky

Структура пароля

md5: <pass><magic><salt><pass>

Создание случайной соли

Возможные варианты создания случайной соли (стандартно используется длина соли 16):

  1. openssl rand -base64 16 | head -c 16
  2. date | md5sum | head -c 16 | sed "s/\s*-\s*$//"
  3. date +%s | sha256sum | base64 | head -c 16
  4. tr -cd '[:alnum:]' < /dev/urandom | fold -w16 | head -n1

Получение чистого хеша пароля

sudo apt install libgost-astra

echo Пароль |  openssl -md_gost12_512

Хеш пароля с солью по ГОСТ 2012.252 в формате /etc/shadow

sudo 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
shadow="\$gost12512hash\$$salt\$$hash" ; echo $shadow

hash=`echo -n "${salt}q2w2e2r2" | openssl dgst -sha512 | awk '{print $2}'` ; echo $hash
shadow="\$6\$$salt\$$hash" ; echo $shadow

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