Введение
В статье описана методика генерации хеша пароля по алгоритму защиного преобразования ГОСТ Р 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). Проверить, где находится библиотека в используемом обновлении можно командой:
Генерация хеша пароля по алгоритму ГОСТ Р 34.11-2012 с помощью функции gost12_512_crypt()
Установка пакетов
Для сборки программы требуется установить компилятор gcc (пакет gcc). Для установки пакета gcc в ALSE x.7 требуется подключить базовый репозиторий, в более ранних обновлениях Astra Linux Special Edition требуется подключить репозиторий диска со средствами разработки. Команда для установки:
Генерация хеша пароля по алгоритму ГОСТ-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; }
./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