【发布时间】: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。我还没有收到任何答复。如果我有任何消息,我会更新这篇文章。
标签: c security cryptography passwords