跳转至

scrypt: 基于 LuaJIT FFI 的 scrypt 库,用于 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

要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua

本文档描述了 lua-resty-scrypt v1.0,于 2014 年 10 月 09 日发布。


lua-resty-scrypt 是一个用于 OpenResty 的 scrypt(密码)哈希库。

使用 lua-resty-scrypt 的 Hello World

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(一个 secret)或一个表。如果是表,您还可以传入一些配置参数。可用的表选项(默认值如下):

local opts = {
    secret   = "",
    keysize  = 32,
    n        = 32768,
    r        = 8,
    p        = 1,
    salt     = "使用 OpenSSL 生成的随机 (saltsize) 字节",
    saltsize = 8
}

如果您传递给 opts 的不是表,它将被 tostring 转换并用作 secretkeysize 可以在 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 是否与使用 scrypt.crypt 从相同 secret 生成的 hash 真的匹配。hash 还包含配置参数,如 nrpsalt

示例
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)

此函数可用于根据 maxmemmaxmemfracmaxtime 参数计算 nrp 配置值。以下是这些参数的默认值:

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)

计算提供的 nrp 参数的 scrypt 算法的内存使用情况。

示例
local memoryuse = scrypt.memoryuse(scrypt.calibrate())

nrp 的默认参数为:

n = 32768
r = 8
p = 1

GitHub

您可以在 nginx-module-scrypt 的 GitHub 仓库 中找到此模块的其他配置提示和文档。