我尝试使用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);
哪个会从编码值派生出类型?
所以,问题是:
由于
答案 0 :(得分:0)
令人困惑的部分是为什么我必须选择调用哪个方法(或者在泛型函数中放入argon2_type类型的内容),因为该类型已经包含在char *编码中? ... RI当前的API设计是否告诉我一些安全性,或可用性是开发人员没有真正防弹的东西?
我担心这只是作者可以回答的问题。但是,一般来说,参考实现可能不像开发人员 of argon2 那样用户友好,而不是图书馆的用户。
从编码值派生类型是否安全,或者我应该选择一种类型并坚持使用它(也就是硬编码)?
禁止降级是有道理的,并且可以明智地使这种过滤可配置。
最终,即使对手完全控制参数,对手也不太可能发现碰撞 - 因此它并不过分严重。
我个人喜欢指定与实际参数分开的特定协议版本,然后指定要使用的算法。