Шифрование и подпись
Криптографические операции: шифрование, HMAC, JWT и деривация ключей. Адаптировано для использования в workflow.
Подключение
local crypto = require("crypto")
Генерация случайных данных
Случайные байты
local bytes, err = crypto.random.bytes(32)
| Параметр | Тип | Описание |
|---|---|---|
length |
integer | Количество байт (1 – 1 048 576) |
Возвращает: string, error
Случайная строка
local str, err = crypto.random.string(32)
local str, err = crypto.random.string(32, "0123456789abcdef")
| Параметр | Тип | Описание |
|---|---|---|
length |
integer | Длина строки (1 – 1 048 576) |
charset |
string? | Набор символов (по умолчанию буквы и цифры) |
Возвращает: string, error
Случайный UUID
local id, err = crypto.random.uuid()
Возвращает: string, error
HMAC
HMAC-SHA256
local hex, err = crypto.hmac.sha256(key, data)
| Параметр | Тип | Описание |
|---|---|---|
key |
string | Ключ HMAC |
data |
string | Данные для аутентификации |
Возвращает: string, error
HMAC-SHA512
local hex, err = crypto.hmac.sha512(key, data)
| Параметр | Тип | Описание |
|---|---|---|
key |
string | Ключ HMAC |
data |
string | Данные для аутентификации |
Возвращает: string, error
Шифрование
AES-GCM {id="encrypt-aes-gcm"}
local encrypted, err = crypto.encrypt.aes(data, key)
local encrypted, err = crypto.encrypt.aes(data, key, aad)
| Параметр | Тип | Описание |
|---|---|---|
data |
string | Открытый текст |
key |
string | 16, 24 или 32 байта (AES-128/192/256) |
aad |
string? | Дополнительные аутентифицируемые данные |
Возвращает: string, error — nonce в начале результата
ChaCha20-Poly1305 {id="encrypt-chacha20"}
local encrypted, err = crypto.encrypt.chacha20(data, key)
local encrypted, err = crypto.encrypt.chacha20(data, key, aad)
| Параметр | Тип | Описание |
|---|---|---|
data |
string | Открытый текст |
key |
string | Ровно 32 байта |
aad |
string? | Дополнительные аутентифицируемые данные |
Возвращает: string, error
Расшифрование
AES-GCM {id="decrypt-aes-gcm"}
local plaintext, err = crypto.decrypt.aes(encrypted, key)
local plaintext, err = crypto.decrypt.aes(encrypted, key, aad)
| Параметр | Тип | Описание |
|---|---|---|
data |
string | Зашифрованные данные из encrypt.aes |
key |
string | Тот же ключ, что при шифровании |
aad |
string? | Должен совпадать с AAD при шифровании |
Возвращает: string, error
ChaCha20-Poly1305 {id="decrypt-chacha20"}
local plaintext, err = crypto.decrypt.chacha20(encrypted, key)
local plaintext, err = crypto.decrypt.chacha20(encrypted, key, aad)
| Параметр | Тип | Описание |
|---|---|---|
data |
string | Зашифрованные данные из encrypt.chacha20 |
key |
string | Тот же ключ, что при шифровании |
aad |
string? | Должен совпадать с AAD при шифровании |
Возвращает: string, error
JWT
Кодирование
local token, err = crypto.jwt.encode(payload, secret)
local token, err = crypto.jwt.encode(payload, secret, "HS256")
local token, err = crypto.jwt.encode(payload, private_key_pem, "RS256")
| Параметр | Тип | Описание |
|---|---|---|
payload |
table | JWT claims (поле _header для пользовательского заголовка) |
key |
string | Секрет (HMAC) или приватный ключ PEM (RSA) |
alg |
string? | HS256, HS384, HS512, RS256 (по умолчанию HS256) |
Возвращает: string, error
Проверка
local claims, err = crypto.jwt.verify(token, secret)
local claims, err = crypto.jwt.verify(token, secret, "HS256", false)
local claims, err = crypto.jwt.verify(token, public_key_pem, "RS256")
| Параметр | Тип | Описание |
|---|---|---|
token |
string | JWT-токен для проверки |
key |
string | Секрет (HMAC) или публичный ключ PEM (RSA) |
alg |
string? | Ожидаемый алгоритм (по умолчанию HS256) |
require_exp |
boolean? | Проверять срок действия (по умолчанию true) |
Возвращает: table, error
Деривация ключей
PBKDF2
local key, err = crypto.pbkdf2(password, salt, iterations, key_length)
local key, err = crypto.pbkdf2(password, salt, iterations, key_length, "sha512")
| Параметр | Тип | Описание |
|---|---|---|
password |
string | Пароль или парольная фраза |
salt |
string | Соль |
iterations |
integer | Количество итераций (максимум 10 000 000) |
key_length |
integer | Желаемая длина ключа в байтах |
hash |
string? | sha256 или sha512 (по умолчанию sha256) |
Возвращает: string, error
Утилиты
Сравнение с постоянным временем
local equal = crypto.constant_time_compare(a, b)
| Параметр | Тип | Описание |
|---|---|---|
a |
string | Первая строка |
b |
string | Вторая строка |
Возвращает: boolean
Ошибки
| Ситуация | Тип | Повтор |
|---|---|---|
| Неверная длина | errors.INVALID |
нет |
| Пустой ключ | errors.INVALID |
нет |
| Неверный размер ключа | errors.INVALID |
нет |
| Ошибка расшифрования | errors.INTERNAL |
нет |
| Токен просрочен | errors.INTERNAL |
нет |
Подробнее см. Обработка ошибок.