Aller au contenu

scrypt: bibliothèque scrypt basée sur FFI de LuaJIT pour nginx-module-lua

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-scrypt v1.0 publié le 09 octobre 2014.


lua-resty-scrypt est une bibliothèque de hachage scrypt (mot de passe) pour OpenResty.

Hello World avec lua-resty-scrypt

local scrypt = require "resty.scrypt"
local hash   = scrypt.crypt "My Secret"         -- retourne un hachage qui peut être stocké dans la base de données
local valid  = scrypt.check("My Secret", hash)  -- valid est vrai
local valid  = scrypt.check("My Guess",  hash)  -- valid est faux

local n,r,p  = scrypt.calibrate()               -- retourne les valeurs de calibration n,r,p

API Lua

string scrypt.crypt(opts)

Utilise l'algorithme scrypt pour générer un hachage à partir de l'entrée. Le paramètre d'entrée opts peut être soit une string (un secret) soit une table. Si c'est une table, vous pouvez également passer certains paramètres de configuration. Les options de table disponibles (les valeurs par défaut sont les suivantes) :

local opts = {
    secret   = "",
    keysize  = 32,
    n        = 32768,
    r        = 8,
    p        = 1,
    salt     = "octets aléatoires (saltsize) générés avec OpenSSL",
    saltsize = 8
}

Si vous passez à opts autre chose qu'une table, cela sera converti en string et utilisé comme secret. keysize peut être compris entre 16 et 512, saltsize peut être compris entre 8 et 32.

Cette fonction retourne une chaîne qui ressemble à ceci :

n$r$p$salt$hash

Toutes les parties présentent un hex dump de leurs valeurs.

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

boolean scrypt.check(secret, hash)

Avec cette fonction, vous pouvez vérifier si le secret correspond vraiment au hash qui a été généré avec scrypt.crypt à partir du même secret. Le hash contient également les paramètres de configuration comme n, r, p et salt.

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

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

Cette fonction peut être utilisée pour compter les valeurs de configuration n, r et p à partir des paramètres maxmem, maxmemfrac et maxtime. Voici les valeurs par défaut pour ceux-ci :

maxmem     = 1048576
maxmemfrac = 0.5
maxtime    = 0.2

Les résultats peuvent varier en fonction de la puissance de traitement de votre ordinateur.

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

Compte l'utilisation de la mémoire de l'algorithme scrypt avec les arguments n, r et p fournis.

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

Les paramètres par défaut pour n, r et p sont :

n = 32768
r = 8
p = 1

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-scrypt.