argon2
LuaJIT 对 Argon2 哈希函数 (Argon2d/Argon2i/Argon2id) 的绑定
$ opm get LoganDark/argon2
luajit-argon2
LuaJIT 对 [20171227 版本的 Argon2]( https://github.com/P-H-C/phc-winner-argon2/blob/670229c849b9fe882583688b74eb7dfdc846f9f6/include/argon2.h) 的绑定,也称为 [Ubuntu 的 argon2
包]( https://packages.ubuntu.com/source/focal/argon2) 或 libargon2.so.1
。
特性
使用 Argon2i、Argon2d 或 Argon2id 进行二进制安全(允许嵌入空字符)的哈希
配置所有“简单”参数,如迭代次数、内存使用量、并行度和盐
Argon2 提供的编码后的哈希值(包含参数,以便以后轻松验证)
针对编码后的哈希值进行验证
兼容性
此模块仅在Linux上与库libargon2.so.1
**一起使用。如果您使用的是 Ubuntu 的 argon2
包,则一切正常。如果不是,请运行以下命令以验证您的系统是否包含兼容的包(不需要 root 权限):
$ ldconfig -p | grep libargon2.so.1
如果得到任何输出,则 argon2.lua
应该能够找到并加载 Argon2。例如,这意味着您安装了正确的库
libargon2.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libargon2.so.1
如果没有,则您需要找到一种方法在您的系统上安装该库。这因发行版而异,因此您需要在线查找。
用法
将 argon2.lua
文件放在包路径中的某个位置(例如,对于 OpenResty,则为 /usr/local/openresty/lualib/argon2.lua
),然后像这样简单地 require
它
local argon2 = require('argon2')
要使用 Luanalysis 类型信息 (argon2.def.lua
),请将该文件放在项目中的某个位置,然后在保存 argon2
模块的变量上包含类型注释
--- @type argon2
local argon2 = require('argon2')
常量
argon2_error_codes
此模块重新导出了 Argon2 的所有错误代码,但不带 ARGON2_
前缀。假设该模块存储在一个名为 argon2
的变量中
argon2.OK
argon2.OUTPUT_PTR_NULL
argon2.OUTPUT_TOO_SHORT
argon2.OUTPUT_TOO_LONG
argon2.PWD_TOO_SHORT
argon2.PWD_TOO_LONG
argon2.SALT_TOO_SHORT
argon2.SALT_TOO_LONG
argon2.AD_TOO_SHORT
argon2.AD_TOO_LONG
argon2.SECRET_TOO_SHORT
argon2.SECRET_TOO_LONG
argon2.TIME_TOO_SMALL
argon2.TIME_TOO_LARGE
argon2.MEMORY_TOO_LITTLE
argon2.MEMORY_TOO_MUCH
argon2.LANES_TOO_FEW
argon2.LANES_TOO_MANY
argon2.PWD_PTR_MISMATCH
argon2.SALT_PTR_MISMATCH
argon2.SECRET_PTR_MISMATCH
argon2.AD_PTR_MISMATCH
argon2.MEMORY_ALLOCATION_ERROR
argon2.FREE_MEMORY_CBK_NULL
argon2.ALLOCATE_MEMORY_CBK_NULL
argon2.INCORRECT_PARAMETER
argon2.INCORRECT_TYPE
argon2.OUT_PTR_MISMATCH
argon2.THREADS_TOO_FEW
argon2.THREADS_TOO_MANY
argon2.MISSING_ARGS
argon2.ENCODING_FAIL
argon2.DECODING_FAIL
argon2.THREAD_FAIL
argon2.DECODING_LENGTH_FAIL
argon2.VERIFY_MISMATCH
argon2_type
此模块重新导出了所有 Argon2 类型。假设该模块存储在一个名为 argon2
的变量中
argon2.argon2d
argon2.argon2i
argon2.argon2id
argon2_version
此模块重新导出了所有 Argon2 版本。假设该模块存储在一个名为 argon2
的变量中
argon2.VERSION_10
argon2.VERSION_13
argon2.VERSION_NUMBER
函数
argon2.error_to_string
语法: str = argon2.error_to_string(code)
返回给定代码的字符串。返回原始枚举常量减去 ARGON2_
- 例如,OK
或 OUTPUT_PTR_NULL
。要获取人类可读的错误消息,请使用 error_message
。
参数
code
:argon2_error_codes
返回值: string
argon2.error_message
语法: str = argon2.error_message(code)
返回给定代码的错误消息。返回每个错误常量 argon2_error_message
返回的内容。
参数
code
:argon2_error_codes
返回值: string
argon2.type_to_string
语法: str = argon2.type_to_string(type, uppercase)
返回给定类型的字符串。这是通过调用 argon2_type2string
完成的。
参数
type
:argon2_type
uppercase
:boolean | nil
返回值: string
argon2.hash
语法: hash, err = argon2.hash(iterations, memory_kb, parallelism, password, salt, hash_len, type, version)
使用提供的盐对给定的密码进行哈希处理,并生成 hash_len
字节的输出。如果哈希处理失败,则将返回 nil
和错误代码。
参数
iterations
:number
要执行的迭代次数。较高的迭代次数会增加算法的时间/计算成本。应调整此值,以便在不使哈希变得过于昂贵从而降低应用程序性能的情况下,使暴力破解变得不可行。
memory_kb
:number
算法要使用的内存量(以千字节为单位)。
parallelism
:number
算法要使用的并行度(线程和计算通道)。这会更改输出。
password
:string
要哈希的密码。允许嵌入零和二进制数据。
salt
:string
要使用的盐。这必须至少为 8 字节,并且应该是随机的。
hash_len
:number
所需的哈希长度(以字节为单位)。较长的哈希会降低冲突的可能性,但需要更多的存储空间。
type
:argon2_type
要使用的 Argon2 算法。Argon2d 可能容易受到侧信道攻击,而 Argon2i 则不会。Argon2id 结合了这两者,如果您不确定,应该使用它。
version
:argon2_version
要使用的 Argon2 版本。通常,只有在使用编码后的哈希值时,才应使用
VERSION_NUMBER
表示最新版本。否则,为了防止静默中断,请选择一个稳定的版本用于哈希,或者确保单独跟踪它。
返回值: string
| nil, argon2_error_codes
argon2.encoded_len
语法: encoded_len = argon2.encoded_len(iterations, memory_kb, parallelism, salt_len, hash_len, type)
返回具有给定参数、盐和哈希长度以及类型的编码哈希所需的字节数。不包括空终止符。
这通常是不必要的,因为 Lua 字符串是可变长度的,但可能存在需要在实际执行工作之前知道编码哈希的大小的情况。例如,hash_encoded
在内部使用此函数来分配一个大小完全合适的缓冲区。
但是,在这种情况下,您可能希望直接使用 argon2
C 函数。
参数
iterations
:number
memory_kb
:number
parallelism
:number
salt_len
:number
hash_len
:number
type
:argon2_type
返回值: number
argon2.hash_encoded
语法: encoded, err = argon2.hash_encoded(iterations, memory_kb, parallelism, password, salt, hash_len, type, version)
使用给定的参数和盐对给定的密码进行哈希处理,并生成一个包含 hash_len
字节输出以及用于哈希的所有参数的编码哈希。如果哈希处理失败,则将返回 nil
和错误代码。
生成的输出是可变长度的,因为它包含参数作为纯文本。
编码后的哈希值如下所示
> argon2.hash_encoded(10000, 64, 1, 'hi', 'thisisasalt', 16, argon2.argon2id, argon2.VERSION_NUMBER)
$argon2id$v=19$m=64,t=10000,p=1$dGhpc2lzYXNhbHQ$TwT+k2qa1WWoQFc4ccF9yw
由于编码后的哈希值包含复制哈希参数所需的所有信息,因此 verify_encoded
只需要密码(和类型)来检查给定的密码是否与编码后的哈希值匹配。此外,可以为高风险帐户(例如管理员)提供更昂贵的哈希(更多迭代次数、内存或并行度),以使它们更难以破解。
参数
所有参数的完整描述位于 argon2.hash
下。
iterations
:number
memory_kb
:number
parallelism
:number
password
:string
salt
:string
hash_len
:number
type
:argon2_type
version
:argon2_version
返回值: string
| nil, argon2_error_codes
argon2.verify_encoded
语法: matches, err = argon2.verify_encoded(encoded, password, type)
验证给定的密码是否与指定类型的编码哈希匹配。如果密码与哈希匹配,则此函数返回 true
,否则返回 false
和错误代码。
通常,如果密码不匹配,则错误代码将为 VERIFY_MISMATCH
。
参数
encoded
:string
password
:string
type
:argon2_type
返回值: true
| false, argon2_error_codes
许可证
MIT 许可证
版权所有 (c) 2022 LoganDark
特此免费授予获得此软件及其相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件的副本,并允许软件被提供给的人员这样做,但须符合以下条件
上述版权声明和本许可声明应包含在所有副本或实质性部分的软件中。
软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,均由软件或软件的使用或其他交易引起或与之相关。
POD 错误
您好!以上文档存在一些编码错误,如下所述:
- 大约在第 46 行
-
未终止的 B<...> 序列
作者
LoganDark
许可证
mit
依赖项
luajit
版本
-
LoganDark/argon2 1.0.1LuaJIT 对 Argon2 哈希函数 (Argon2d/Argon2i/Argon2id) 的绑定 2022-05-05 13:21:15
-
LoganDark/argon2 1.0.0LuaJIT 对 Argon2 哈希函数 (Argon2dArgon2i/Argon2id) 的绑定 2022-05-04 18:20:06