从编码的哈希值派生 Argon2 类型是不是安全?

Posted

技术标签:

【中文标题】从编码的哈希值派生 Argon2 类型是不是安全?【英文标题】:Is it safe to derive the Argon2 type from the encoded hash value?从编码的哈希值派生 Argon2 类型是否安全? 【发布时间】:2018-05-18 21:56:31 【问题描述】:

我正在尝试使用 Argon2 参考实现,但在验证期间对类型参数 (i, d, id) 的使用有点困惑。

对于密码验证,我需要调用库的*verify* 函数之一。这些函数带有“高级”API:

/**
 * Verifies a password against an encoded string
 * Encoded string is restricted as in validate_inputs()
 * @param encoded String encoding parameters, salt, hash
 * @param pwd Pointer to password
 * @pre   Returns ARGON2_OK if successful
 */
ARGON2_PUBLIC int argon2i_verify(const char *encoded, const void *pwd, const size_t pwdlen);
ARGON2_PUBLIC int argon2d_verify(const char *encoded, const void *pwd, const size_t pwdlen);
ARGON2_PUBLIC int argon2id_verify(const char *encoded, const void *pwd, const size_t pwdlen);
/* generic function underlying the above ones */
ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen, argon2_type type);

令人困惑的部分是为什么我必须选择调用哪个方法(或者在泛型函数上放入argon2_type type 的内容),因为类型已经包含在char *encoded 中?

从应用程序的角度来看,我需要事先知道每个密码使用哪种类型。但是……这就是编码的全部意义所在。如果只有一个*verify*函数不是很好吗?

ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen);

哪个会从编码值中派生出类型?

所以,问题是:

RI 当前的 API 设计是否告诉我有关安全性的信息,或者 可用性是开发人员没有真正防弹的东西吗? 从编码值派生类型是否安全,或者我应该选择一种类型并坚持使用它(也就是硬编码)?

谢谢

【问题讨论】:

小心在任何与安全相关的事情中使用 C;上面的代码本身似乎没有执行任何边界检查等。顺便说一句,为什么不联系作者呢?我得到了很好的结果直接询问(当然你需要对它很好,例如首先感谢他们创建代码)。 几天前我开了一个issue on github。我还没有收到任何答复。如果我有任何消息,我会更新这篇文章。 【参考方案1】:

令人困惑的部分是为什么我必须选择调用哪个方法(或在泛型函数的 argon2_type 类型中放入什么),因为该类型已经包含在 char *encoded 中? ... RI 当前的 API 设计是否告诉我一些关于安全性的信息,或者可用性是开发人员并没有真正防弹的东西?

恐怕只有作者才能回答。但是,通常参考实现可能不像那些 argon2 的开发人员那样对用户友好,对于库的用户而言更是如此。

从编码值派生类型是否安全,或者我应该选择一种类型并坚持使用它(也就是硬编码)?

禁止降级是有意义的,将这种过滤设置为可配置可能是明智之举。

最终,即使对手完全控制参数,对手也不太可能发现冲突 - 所以它并不过分关键。

我个人喜欢指定一个特定的协议版本与实际参数分开,然后指定使用哪种算法。

【讨论】:

以上是关于从编码的哈希值派生 Argon2 类型是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5 如何为 argon2 存储盐?

安全技术系列 密码学-哈希算法

HSM 和 Argon2 的区别?哪一个更可取

Powershell Base64 URL 安全编码上面的二进制哈希字符串,使其适用于 HTTP 请求

区块链世界的哈希算法?什么是哈希值?

4.1 所有类型都从 System.Object 派生