从编码的哈希值中导出Argon2类型是否安全?

时间:2017-12-05 09:34:44

标签: c security cryptography passwords

我尝试使用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设计是否告诉我有关安全性的信息,或者 可用性是开发人员没有真正防弹的东西吗?
  • 从编码值派生类型是否安全,或者我应该选择一种类型并坚持下去(又称硬编码)?

由于

1 个答案:

答案 0 :(得分:0)

  

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

我担心这只是作者可以回答的问题。但是,一般来说,参考实现可能不像开发人员 of argon2 那样用户友好,而不是图书馆的用户。

  

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

禁止降级是有道理的,并且可以明智地使这种过滤可配置。

最终,即使对手完全控制参数,对手也不太可能发现碰撞 - 因此它并不过分严重。

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