scrypt: biblioteca scrypt basada en FFI de LuaJIT para nginx-module-lua
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o 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
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-scrypt v1.0 lanzado el 09 de octubre de 2014.
lua-resty-scrypt es una biblioteca de hashing scrypt (contraseña) para OpenResty.
Hola Mundo con lua-resty-scrypt
local scrypt = require "resty.scrypt"
local hash = scrypt.crypt "My Secret" -- devuelve un hash que se puede almacenar en db
local valid = scrypt.check("My Secret", hash) -- valid es verdadero
local valid = scrypt.check("My Guess", hash) -- valid es falso
local n,r,p = scrypt.calibrate() -- devuelve valores de calibración n,r,p
API de Lua
string scrypt.crypt(opts)
Utiliza el algoritmo scrypt para generar un hash a partir de la entrada. El parámetro de entrada opts puede ser string (un secret) o una tabla. Si es una tabla, puedes pasar algunos parámetros de configuración también. Las opciones de tabla disponibles (los valores predeterminados son los siguientes):
local opts = {
secret = "",
keysize = 32,
n = 32768,
r = 8,
p = 1,
salt = "bytes aleatorios (saltsize) generados con OpenSSL",
saltsize = 8
}
Si pasas opts algo que no sea una tabla, se convertirá a string y se usará como un secret. keysize puede estar entre 16 y 512, saltsize puede estar entre 8 y 32.
Esta función devuelve una cadena que se ve así:
n$r$p$salt$hash
Todas las partes presentan un hex dump de sus valores.
Ejemplo
local h1 = scrypt.crypt "My Secret"
local h2 = scrypt.crypt{
secret = "My Secret",
keysize = 512
}
boolean scrypt.check(secret, hash)
Con esta función puedes verificar si el secret realmente coincide con el hash que fue generado con scrypt.crypt del mismo secret. El hash también contiene los parámetros de configuración como n, r, p y salt.
Ejemplo
local b1 = scrypt.check("My Secret", scrypt.crypt "My Secret") -- devuelve true
local b2 = scrypt.check("My Secret", scrypt.crypt "No Secret") -- devuelve false
n, r, p scrypt.calibrate(maxmem, maxmemfrac, maxtime)
Esta función se puede usar para contar los valores de configuración n, r y p a partir de los parámetros maxmem, maxmemfrac y maxtime. Estos son los valores predeterminados para esos:
maxmem = 1048576
maxmemfrac = 0.5
maxtime = 0.2
Los resultados pueden cambiar dependiendo de la potencia de procesamiento de tu computadora.
Ejemplo
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)
Cuenta el uso de memoria del algoritmo scrypt con los argumentos n, r y p proporcionados.
Ejemplo
local memoryuse = scrypt.memoryuse(scrypt.calibrate())
Los parámetros predeterminados para n, r y p son:
n = 32768
r = 8
p = 1
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-scrypt.