在MYSQL中复制php的hash_hmac功能


Reproducing PHPs hash_hmac functionality in MYSQL

我正在创建一个更安全的用户密码表,其中包含用户名、强随机盐和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没有太多的运气。当从脚本部署DB服务器时,我需要创建一些用户。据我所知,hash_hmac方法只是获取盐,将密码附加到其上,然后使用sha 512对其进行散列。似乎这在MySQL中很容易做到,但是这个:

INSERT INTO `users` (`email`, `username`, `password`, `salt`) 
VALUES('test@example.com', 'admin', SHA2('9d1ebf3559baf9ffca61df5cec0b9eb067ae7912d097ad45f3a3086c39bf11292d92a7dfad497557fac7fbf7c24209db8b7696664d54c7e6bc55f720121bd38dadmin', 512), '9d1ebf3559baf9ffca61df5cec0b9eb067ae7912d097ad45f3a3086c39bf11292d92a7dfad497557fac7fbf7c24209db8b7696664d54c7e6bc55f720121bd38d');

在本例中,salt只是我手动生成的硬编码,您可以看到我只是将密码"admin"附加到密码字段的末尾。这个用户创建了,但是我不能用admin用户名和密码登录。

我应该在MySQL中以不同的方式做这个吗?

HMAC不是通过连接计算的,而是如下所示(查看链接了解更多细节)

HMAC H (K、m) = ((K⊕opad)∥H (ipad (K⊕)∥m))

但是,顾名思义,它是消息验证码,而不是密码散列方案。为密码散列设计的算法将是更好的选择。script、bcrypt或PBKDF2都是不错的选择。