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

scrypt: библиотека scrypt на основе LuaJIT FFI для nginx-module-lua

Установка

Если вы еще не подписались на репозиторий 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-scrypt

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

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

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

Этот документ описывает lua-resty-scrypt v1.0, выпущенную 9 октября 2014 года.


lua-resty-scrypt — это библиотека для хеширования паролей scrypt для OpenResty.

Hello World с lua-resty-scrypt

local scrypt = require "resty.scrypt"
local hash   = scrypt.crypt "My Secret"         -- возвращает хеш, который можно сохранить в БД
local valid  = scrypt.check("My Secret", hash)  -- valid будет true
local valid  = scrypt.check("My Guess",  hash)  -- valid будет false

local n,r,p  = scrypt.calibrate()               -- возвращает значения калибровки n,r,p

Lua API

string scrypt.crypt(opts)

Использует алгоритм scrypt для генерации хеша из входных данных. Параметр ввода opts может быть либо string (секрет), либо таблицей. Если это таблица, вы можете передать некоторые параметры конфигурации. Доступные параметры таблицы (по умолчанию):

local opts = {
    secret   = "",
    keysize  = 32,
    n        = 32768,
    r        = 8,
    p        = 1,
    salt     = "случайные (saltsize) байты, сгенерированные с помощью OpenSSL",
    saltsize = 8
}

Если вы передадите opts что-то кроме таблицы, это будет преобразовано в строку и использовано как secret. keysize может быть от 16 до 512, saltsize может быть от 8 до 32.

Эта функция возвращает строку, которая выглядит следующим образом:

n$r$p$salt$hash

Все части представляют собой hex dump их значений.

Пример
local h1 = scrypt.crypt "My Secret"
local h2 = scrypt.crypt{
    secret  = "My Secret",
    keysize = 512
}

boolean scrypt.check(secret, hash)

С помощью этой функции вы можете проверить, действительно ли secret соответствует hash, который был сгенерирован с помощью scrypt.crypt из того же secret. hash также содержит параметры конфигурации, такие как n, r, p и salt.

Пример
local b1 = scrypt.check("My Secret", scrypt.crypt "My Secret") -- возвращает true
local b2 = scrypt.check("My Secret", scrypt.crypt "No Secret") -- возвращает false

n, r, p scrypt.calibrate(maxmem, maxmemfrac, maxtime)

Эта функция может быть использована для вычисления значений конфигурации n, r и p из параметров maxmem, maxmemfrac и maxtime. По умолчанию они равны:

maxmem     = 1048576
maxmemfrac = 0.5
maxtime    = 0.2

Результаты могут изменяться в зависимости от вычислительной мощности вашего компьютера.

Пример
local n,r,p = scrypt.calibrate()
local hash  = scrypt.crypt{
    secret  = "My Secret",
    n = n,
    r = r,
    p = p
}

number scrypt.memoryuse(n, r, p)

Подсчитывает использование памяти алгоритмом scrypt с предоставленными аргументами n, r и p.

Пример
local memoryuse = scrypt.memoryuse(scrypt.calibrate())

Параметры по умолчанию для n, r и p:

n = 32768
r = 8
p = 1

GitHub

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