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_ - 例如,OKOUTPUT_PTR_NULL。要获取人类可读的错误消息,请使用 error_message

参数

  1. code: argon2_error_codes

返回值: string

argon2.error_message

语法: str = argon2.error_message(code)

返回给定代码的错误消息。返回每个错误常量 argon2_error_message 返回的内容。

参数

  1. code: argon2_error_codes

返回值: string

argon2.type_to_string

语法: str = argon2.type_to_string(type, uppercase)

返回给定类型的字符串。这是通过调用 argon2_type2string 完成的。

参数

  1. type: argon2_type

  2. uppercase: boolean | nil

返回值: string

argon2.hash

语法: hash, err = argon2.hash(iterations, memory_kb, parallelism, password, salt, hash_len, type, version)

使用提供的盐对给定的密码进行哈希处理,并生成 hash_len 字节的输出。如果哈希处理失败,则将返回 nil 和错误代码。

参数

  1. iterations: number

    要执行的迭代次数。较高的迭代次数会增加算法的时间/计算成本。应调整此值,以便在不使哈希变得过于昂贵从而降低应用程序性能的情况下,使暴力破解变得不可行。

  1. memory_kb: number

    算法要使用的内存量(以千字节为单位)。

  1. parallelism: number

    算法要使用的并行度(线程和计算通道)。这会更改输出。

  1. password: string

    要哈希的密码。允许嵌入零和二进制数据。

  1. salt: string

    要使用的盐。这必须至少为 8 字节,并且应该是随机的。

  1. hash_len: number

    所需的哈希长度(以字节为单位)。较长的哈希会降低冲突的可能性,但需要更多的存储空间。

  1. type: argon2_type

    要使用的 Argon2 算法。Argon2d 可能容易受到侧信道攻击,而 Argon2i 则不会。Argon2id 结合了这两者,如果您不确定,应该使用它。

  1. 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 函数。

参数

  1. iterations: number

  2. memory_kb: number

  3. parallelism: number

  4. salt_len: number

  5. hash_len: number

  6. 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 下。

  1. iterations: number

  2. memory_kb: number

  3. parallelism: number

  4. password: string

  5. salt: string

  6. hash_len: number

  7. type: argon2_type

  8. version: argon2_version

返回值: string | nil, argon2_error_codes

argon2.verify_encoded

语法: matches, err = argon2.verify_encoded(encoded, password, type)

验证给定的密码是否与指定类型的编码哈希匹配。如果密码与哈希匹配,则此函数返回 true,否则返回 false 和错误代码。

通常,如果密码不匹配,则错误代码将为 VERIFY_MISMATCH

参数

  1. encoded: string

  2. password: string

  3. type: argon2_type

返回值: true | false, argon2_error_codes

许可证

MIT 许可证

版权所有 (c) 2022 LoganDark

特此免费授予获得此软件及其相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件的副本,并允许软件被提供给的人员这样做,但须符合以下条件

上述版权声明和本许可声明应包含在所有副本或实质性部分的软件中。

软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,均由软件或软件的使用或其他交易引起或与之相关。

POD 错误

您好!以上文档存在一些编码错误,如下所述:

大约在第 46 行

未终止的 B<...> 序列

作者

LoganDark

许可证

mit

依赖项

luajit

版本