我正在创建一个更安全的用户密码表,其中包括用户名,高度随机的盐和php中的盐/哈希密码,如下所示:
$salt = bin2hex(openssl_random_pseudo_bytes(64));
$pass = hash_hmac('sha512', $plainTextPass, $salt);
$this->user->password = $pass;
$this->user->salt = $salt;
$this->user->save();
我试图在MySQL中重现此功能,但没有多大运气。从脚本部署数据库服务器时,我需要创建一些用户。据我了解,hash_hmac方法只需要加盐,将密码附加到密码上,然后使用sha 512对其进行哈希处理。似乎在MySQL中这样做很容易,但这是:
INSERT INTO `users` (`email`, `username`, `password`, `salt`)
VALUES('[email protected]', 'admin', SHA2('9d1ebf3559baf9ffca61df5cec0b9eb067ae7912d097ad45f3a3086c39bf11292d92a7dfad497557fac7fbf7c24209db8b7696664d54c7e6bc55f720121bd38dadmin', 512), '9d1ebf3559baf9ffca61df5cec0b9eb067ae7912d097ad45f3a3086c39bf11292d92a7dfad497557fac7fbf7c24209db8b7696664d54c7e6bc55f720121bd38d');
在这种情况下,salt只是我手动生成的一个硬编码的盐,您可以看到我只是在密码字段的末尾附加了密码“ admin”。该用户创建,但无法使用该管理员用户名和密码登录。
我应该在MySQL中以其他方式执行此操作吗?
最佳答案
HMAC不是通过串联计算的,而是如下所示(有关更多详细信息,请参见链接)。
HMAC(K,m)= H(((K⊕opad)∥H((K⊕ipad)∥m))
但是,顾名思义,它是消息身份验证代码,而不是密码哈希方案。设计用于密码哈希的算法将是更好的选择。 scrypt,bcrypt或PBKDF2是不错的选择。