Перейти к содержанию

string: Утилиты строк и общие хеш-функции для nginx-module-lua и LuaJIT

Установка

Если вы еще не настроили подписку на репозиторий RPM, подпишитесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-string

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-string

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-string v0.16, выпущенный 8 августа 2024 года.


Эта библиотека требует сборку nginx с OpenSSL, модуль ngx_lua и LuaJIT 2.0.

Синопсис

    # nginx.conf:

    server {
        location = /test {
            content_by_lua_file conf/test.lua;
        }
    }

    -- conf/test.lua:

    local resty_sha1 = require "resty.sha1"

    local sha1 = resty_sha1:new()
    if not sha1 then
        ngx.say("не удалось создать объект sha1")
        return
    end

    local ok = sha1:update("hello, ")
    if not ok then
        ngx.say("не удалось добавить данные")
        return
    end

    ok = sha1:update("world")
    if not ok then
        ngx.say("не удалось добавить данные")
        return
    end

    local digest = sha1:final()  -- бинарный дайджест

    local str = require "resty.string"
    ngx.say("sha1: ", str.to_hex(digest))
        -- вывод: "sha1: b7e23ec29af22b0b4e41da31e868d57226121c84"

    local resty_md5 = require "resty.md5"
    local md5 = resty_md5:new()
    if not md5 then
        ngx.say("не удалось создать объект md5")
        return
    end

    local ok = md5:update("hel")
    if not ok then
        ngx.say("не удалось добавить данные")
        return
    end

        -- md5:update() с необязательным параметром "len"
    ok = md5:update("loxxx", 2)
    if not ok then
        ngx.say("не удалось добавить данные")
        return
    end

    local digest = md5:final()

    local str = require "resty.string"
    ngx.say("md5: ", str.to_hex(digest))
        -- вывод: "md5: 5d41402abc4b2a76b9719d911017c592"

    local resty_sha224 = require "resty.sha224"
    local str = require "resty.string"
    local sha224 = resty_sha224:new()
    ngx.say(sha224:update("hello"))
    local digest = sha224:final()
    ngx.say("sha224: ", str.to_hex(digest))

    local resty_sha256 = require "resty.sha256"
    local str = require "resty.string"
    local sha256 = resty_sha256:new()
    ngx.say(sha256:update("hello"))
    local digest = sha256:final()
    ngx.say("sha256: ", str.to_hex(digest))

    local resty_sha512 = require "resty.sha512"
    local str = require "resty.string"
    local sha512 = resty_sha512:new()
    ngx.say(sha512:update("hello"))
    local digest = sha512:final()
    ngx.say("sha512: ", str.to_hex(digest))

    local resty_sha384 = require "resty.sha384"
    local str = require "resty.string"
    local sha384 = resty_sha384:new()
    ngx.say(sha384:update("hel"))
    ngx.say(sha384:update("lo"))
    local digest = sha384:final()
    ngx.say("sha384: ", str.to_hex(digest))

    local resty_random = require "resty.random"
    local str = require "resty.string"
    local random = resty_random.bytes(16)
        -- генерировать 16 байт псевдослучайных данных
    ngx.say("псевдослучайные: ", str.to_hex(random))

    local resty_random = require "resty.random"
    local str = require "resty.string"
    local strong_random = resty_random.bytes(16,true)
        -- попытка сгенерировать 16 байт
        -- криптографически стойких случайных данных
    while strong_random == nil do
        strong_random = resty_random.bytes(16,true)
    end
    ngx.say("случайные: ", str.to_hex(strong_random))

    local aes = require "resty.aes"
    local str = require "resty.string"
    local aes_128_cbc_md5 = aes:new("AKeyForAES")
        -- шифр по умолчанию - AES 128 CBC с 1 раундом MD5
        -- для ключа и нулевым солью
    local encrypted = aes_128_cbc_md5:encrypt("Секретное сообщение!")
    ngx.say("AES 128 CBC (MD5) Зашифрованный HEX: ", str.to_hex(encrypted))
    ngx.say("AES 128 CBC (MD5) Расшифрованный: ", aes_128_cbc_md5:decrypt(encrypted))

    local aes = require "resty.aes"
    local str = require "resty.string"
    local aes_256_cbc_sha512x5 = aes:new("AKeyForAES-256-CBC",
        "MySalt!!", aes.cipher(256,"cbc"), aes.hash.sha512, 5)
        -- AES 256 CBC с 5 раундами SHA-512 для ключа
        -- и солью "MySalt!!"
        -- Примечание: соль может быть либо nil, либо ровно 8 символов
    local encrypted = aes_256_cbc_sha512x5:encrypt("Действительно секретное сообщение!")
    ngx.say("AES 256 CBC (SHA-512, с солью) Зашифрованный HEX: ", str.to_hex(encrypted))
    ngx.say("AES 256 CBC (SHA-512, с солью) Расшифрованный: ",
        aes_256_cbc_sha512x5:decrypt(encrypted))

    local aes = require "resty.aes"
    local str = require "resty.string"
    local aes_128_cbc_with_iv = assert(aes:new("1234567890123456",
        nil, aes.cipher(128,"cbc"), {iv="1234567890123456"}))
        -- AES 128 CBC с IV и без SALT
    local encrypted = aes_128_cbc_with_iv:encrypt("Действительно секретное сообщение!")
    ngx.say("AES 128 CBC (С IV) Зашифрованный HEX: ", str.to_hex(encrypted))
    ngx.say("AES 128 CBC (С IV) Расшифрованный: ",
        aes_128_cbc_with_iv:decrypt(encrypted))

    local aes = require "resty.aes"
    local str = require "resty.string"
    local enable_padding = false
    local aes_256_cbc_with_padding = aes:new(
        key, nil, aes.cipher(256,"cbc"), {iv = string.sub(key, 1, 16)}, nil,
        nil, enable_padding)
        -- AES-256 CBC (пользовательская генерация ключа, пользовательская подкладка с размером блока=32)
    local text = "hello"
    local block_size = 32
    local pad = block_size - #text % 32
    local text_paded = text .. string.rep(string.char(pad), pad)
    local encrypted = aes_256_cbc_with_padding:encrypt(text_paded)
    ngx.say("AES-256 CBC (пользовательская генерация ключа, пользовательская подкладка с размером блока=32) HEX: ",
        str.to_hex(encrypted))

См. также

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-string.