Оглавление |
---|
Введение
В статье описана методика генерации хеша пароля по алгоритму защиного преобразования ГОСТ Р 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 требуется подключить репозиторий диска со средствами разработки. Команда для установки:
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( "pass=%s salt=%s hash=%s\n", pass, salt, hash);
return 0;
} |
Command |
---|
gcc hash.c /lib/libgost.so.2.0.2 |
Блок кода |
---|
./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 |
Предупреждение |
---|
Статья не для передачи заказчикам. |
Оглавление |
---|
Создание случайной соли
Возможные варианты создания случайной соли (для примера выбрана длина соли 16):
- openssl rand -base64 16 | head -c 16
- date | md5sum | head -c 16 | sed "s/\s*-\s*$//"
- date +%s | sha256sum | base64 | head -c 16
- tr -cd '[:alnum:]' < /dev/urandom | fold -w16 | head -n1
Получение чистого хеша пароля
sudo apt install libgost-astra
echo Пароль | openssl -md_gost12_512
Хеш пароля с солью по ГОСТ 2012.252 в формате /etc/shadow
salt=`openssl rand -base64 16 | head -c 16`
echo $salt
hash=`echo "${salt}Пароль" | openssl dgst -md_gost12_512 | awk '{print $2}'`
echo $hash
shadow="\$gost12512hash\$$salt\$$hash"
echo $shadow
sudo sed -n "s/^luser:[^:]*/luser:${shadow/\//\\/}/p" /etc/shadow
sudo grep luser /etc/shadow
echo -n "`openssl rand -base64 16 | head -c 16`Пароль" | openssl dgst -md_gost12_512 | sed "s/^.*= /\$gost12512hash\$/"
...