Page tree

Введение

В статье описана методика генерации хеша пароля по алгоритму защиного преобразования ГОСТ Р 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). Проверить, где находится библиотека в используемом обновлении можно командой:

dpkg -L libgost

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

Установка пакетов

Для сборки программы требуется установить компилятор gcc (пакет gcc). Для установки пакета gcc в ALSE x.7 требуется подключить базовый репозиторий, в более ранних обновлениях Astra Linux Special Edition требуется подключить репозиторий диска со средствами разработки. Команда для установки:

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( "pass=%s salt=%s hash=%s\n", pass, salt, hash);
        return 0;
}

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

gcc hash.c /lib/libgost.so.2.0.2
В результате выполнения команды будет создан исполняемый файл 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 установка дополнительных пакетов не требуется.

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

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

#!/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


  • No labels