Поиск публикаций
Муниципальные услуги

Получите услугу онлайн

Перейти

Криптография

Полное руководство по криптографическим функциям WDSP

 Хеширование

крипто.хэш(алгоритм, данные)

Вычисляет хеш-сумму от данных по указанному алгоритму.

ПараметрТипОписание
алгоритмстрокаПоддерживается: "sha256", "sha512"
данныестрокаИсходные данные в кодировке UTF-8
Возвращает: строка (шестнадцатеричное представление хеша)
Пример:
$хеш256 = крипто.хэш("sha256", "Привет, мир!");
вывод("SHA256: " + $хеш256);

 Случайные байты

крипто.случайныеБайты(количество)

Генерирует криптостойкую последовательность случайных байт заданной длины.

ПараметрТипОписание
количествочислоКоличество байт (целое положительное)
Возвращает: строка (шестнадцатеричное представление случайных байт)
Пример:
$соль = крипто.случайныеБайты(16);  // 16 байт = 32 hex-символа

 PBKDF2 – получение ключа из пароля

крипто.изПароля(пароль, соль, итерации, длина)

Вычисляет криптографический ключ на основе пароля, соли и количества итераций по алгоритму PBKDF2 (с HMAC-SHA256).

ПараметрТипОписание
парольстрокаПароль (UTF-8)
сольстрока (hex)Соль в шестнадцатеричном представлении (рекомендуется ≥ 16 байт)
итерациичислоКоличество итераций (рекомендуется ≥ 10 000)
длиначислоЖелаемая длина ключа в байтах
Возвращает: строка (шестнадцатеричное представление ключа)
Важно: соль должна быть уникальной для каждого пароля и храниться вместе с результатом. Количество итераций должно быть достаточно большим для защиты от перебора.
Пример:
$соль = крипто.случайныеБайты(16);
$ключ = крипто.изПароля("мойПароль", $соль, 10000, 32);

 HMAC – ключевое хеширование

крипто.hmac(алгоритм, ключ, данные)

Вычисляет код аутентификации сообщения (HMAC) по указанному алгоритму.

ПараметрТипОписание
алгоритмстрока"sha256" или "sha512"
ключстрока (hex)Ключ в шестнадцатеричном представлении
данныестрокаСообщение (UTF-8)
Возвращает: строка (шестнадцатеричное представление HMAC)
Пример:
$ключ = крипто.случайныеБайты(32);
$hmac = крипто.hmac("sha256", $ключ, "Сообщение");

 Шифрование AES-256-GCM

крипто.шифровать(алгоритм, ключ, данные [, iv])

Шифрует данные с использованием алгоритма AES-256-GCM. Возвращает объект с полями iv, tag, ciphertext.

ПараметрТипОписание
алгоритмстрокаДолжен быть "aes-256-gcm"
ключстрока (hex)Ключ длиной 32 байта (64 hex-символа)
данныестрокаОткрытый текст (UTF-8)
iv (необязательный)строка (hex)Вектор инициализации (12 байт, 24 hex-символа). Если не указан, генерируется автоматически.
Возвращает: объект со свойствами:
  • iv – вектор инициализации (hex)
  • tag – тег аутентификации (16 байт, hex)
  • ciphertext – зашифрованные данные (hex)
Важно: IV должен быть уникальным для каждого шифрования с одним и тем же ключом. Храните IV и тег вместе с зашифрованным текстом.
Пример:
$ключ = крипто.случайныеБайты(32);
$шифровано = крипто.шифровать("aes-256-gcm", $ключ, "Секретные данные");
// $шифровано.iv, $шифровано.tag, $шифровано.ciphertext

 Расшифрование AES-256-GCM

крипто.расшифровать(алгоритм, ключ, объект)

Расшифровывает данные, зашифрованные функцией шифровать.

ПараметрТипОписание
алгоритмстрока"aes-256-gcm"
ключстрока (hex)Тот же ключ, что использовался для шифрования
объектобъектОбъект с полями iv, tag, ciphertext (как возвращено шифровать)
Возвращает: строка (исходный открытый текст)
Пример:
$расшифровано = крипто.расшифровать("aes-256-gcm", $ключ, $шифровано);

 Преобразование hex ↔ base64

крипто.hexВBase64(hex)

Преобразует шестнадцатеричную строку в Base64.

ПараметрТипОписание
hexстрокаШестнадцатеричная строка (чётное количество символов)
Возвращает: строка в Base64

крипто.base64ВHex(base64)

Преобразует строку Base64 обратно в шестнадцатеричное представление.

ПараметрТипОписание
base64строкаСтрока в кодировке Base64
Возвращает: шестнадцатеричная строка
Пример:
$hex = "48656c6c6f";
$b64 = крипто.hexВBase64($hex);        // "SGVsbG8="
$обратно = крипто.base64ВHex($b64);      // "48656c6c6f"

 Полный пример теста

Ниже приведён полный тестовый скрипт, демонстрирующий все функции модуля:

вывод("=== Тест модуля криптографии ===\n");

$текст = "Привет, мир!";

// 1. Хеш SHA256
$хеш256 = крипто.хэш("sha256", $текст);
вывод("1. SHA256 хеш: " + $хеш256 + "\n");

// 2. Хеш SHA512
$хеш512 = крипто.хэш("sha512", $текст);
вывод("2. SHA512 хеш: " + $хеш512 + "\n");

// 3. Случайные байты
$случайные = крипто.случайныеБайты(16);
вывод("3. Случайные 16 байт: " + $случайные + "\n");

// 4. PBKDF2
$пароль = "секретныйПароль123";
$соль = крипто.случайныеБайты(16);
$ключИзПароля = крипто.изПароля($пароль, $соль, 10000, 32);
вывод("4. Ключ из пароля (32 байта): " + $ключИзПароля + "\n");

// 5. HMAC-SHA256
$ключ = крипто.случайныеБайты(32);
$hmac256 = крипто.hmac("sha256", $ключ, $текст);
вывод("5. HMAC-SHA256: " + $hmac256 + "\n");

// 6. HMAC-SHA512
$hmac512 = крипто.hmac("sha512", $ключ, $текст);
вывод("6. HMAC-SHA512: " + $hmac512 + "\n");

// 7. Шифрование AES-256-GCM
$данные = "Секретные данные для теста!";
$шифровано = крипто.шифровать("aes-256-gcm", $ключ, $данные);
вывод("7. Зашифровано:\n  IV: " + $шифровано.iv + "\n  Тег: " + $шифровано.tag + "\n  Шифротекст: " + $шифровано.ciphertext + "\n");

// 8. Расшифрование
$расшифровано = крипто.расшифровать("aes-256-gcm", $ключ, $шифровано);
вывод("8. Расшифровано: " + $расшифровано + "\n");
если ($расшифровано == $данные) {
    вывод("   Результат: OK\n");
} иначе {
    вывод("   Результат: ОШИБКА\n");
}

// 9. Преобразование hex <-> base64
$hex = $хеш256;
$base64 = крипто.hexВBase64($hex);
$обратноHex = крипто.base64ВHex($base64);
вывод("9. Hex: " + $hex + "\n");
вывод("   Base64: " + $base64 + "\n");
вывод("   Обратно в Hex: " + $обратноHex + "\n");
если ($обратноHex == $hex) {
    вывод("   Преобразование корректно\n");
} иначе {
    вывод("   Ошибка преобразования\n");
}

// 10. Шифрование без IV (автогенерация)
$шифровано2 = крипто.шифровать("aes-256-gcm", $ключ, "Тест без IV");
вывод("10. Шифрование без IV: IV = " + $шифровано2.iv + "\n");
$расшифровано2 = крипто.расшифровать("aes-256-gcm", $ключ, $шифровано2);
если ($расшифровано2 == "Тест без IV") {
    вывод("    Расшифровка успешна\n");
} иначе {
    вывод("    Ошибка расшифровки\n");
}

вывод("=== Тест криптографии завершён ===\n");