Pular para conteúdo

scrypt: Biblioteca scrypt baseada em FFI do LuaJIT para nginx-module-lua

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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 com o NGINX, certifique-se de que o nginx-module-lua está instalado.

Este documento descreve lua-resty-scrypt v1.0 lançado em 09 de outubro de 2014.


lua-resty-scrypt é uma biblioteca de hash scrypt (senha) para OpenResty.

Olá Mundo com lua-resty-scrypt

local scrypt = require "resty.scrypt"
local hash   = scrypt.crypt "My Secret"         -- retorna um hash que pode ser armazenado no db
local valid  = scrypt.check("My Secret", hash)  -- valid é verdadeiro
local valid  = scrypt.check("My Guess",  hash)  -- valid é falso

local n,r,p  = scrypt.calibrate()               -- retorna os valores de calibração n,r,p

API Lua

string scrypt.crypt(opts)

Usa o algoritmo scrypt para gerar um hash a partir da entrada. O parâmetro de entrada opts pode ser string (um secret) ou uma tabela. Se for uma tabela, você pode passar alguns parâmetros de configuração também. As opções de tabela disponíveis (os padrões são os seguintes):

local opts = {
    secret   = "",
    keysize  = 32,
    n        = 32768,
    r        = 8,
    p        = 1,
    salt     = "bytes aleatórios (saltsize) gerados com OpenSSL",
    saltsize = 8
}

Se você passar opts qualquer coisa que não seja uma tabela, ele será convertido para string e usado como um secret. keysize pode estar entre 16 e 512, saltsize pode estar entre 8 e 32.

Esta função retorna uma string que se parece com isto:

n$r$p$salt$hash

Todas as partes apresentam um hex dump de seus valores.

Exemplo
local h1 = scrypt.crypt "My Secret"
local h2 = scrypt.crypt{
    secret  = "My Secret",
    keysize = 512 
}

boolean scrypt.check(secret, hash)

Com esta função, você pode verificar se o secret realmente corresponde ao hash que foi gerado com scrypt.crypt a partir do mesmo secret. O hash também contém os parâmetros de configuração como n, r, p e salt.

Exemplo
local b1 = scrypt.check("My Secret", scrypt.crypt "My Secret") -- retorna true
local b2 = scrypt.check("My Secret", scrypt.crypt "No Secret") -- retorna false

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

Esta função pode ser usada para contar os valores de configuração n, r e p a partir dos parâmetros maxmem, maxmemfrac e maxtime. Estes são os padrões para esses:

maxmem     = 1048576
maxmemfrac = 0.5
maxtime    = 0.2

Os resultados podem mudar dependendo do poder de processamento do seu computador.

Exemplo
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)

Conta o uso de memória do algoritmo scrypt com os argumentos n, r e p fornecidos.

Exemplo
local memoryuse = scrypt.memoryuse(scrypt.calibrate())

Os parâmetros padrão para n, r e p são:

n = 32768
r = 8
p = 1

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-scrypt.