在MYSQL中重现PHPs hash_hmac功能

时间:2013-06-05 15:24:40

标签: php mysql cryptography

我正在创建一个更安全的用户密码表,其中包含用户名,强随机盐以及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”附加到密码字段的末尾。此用户创建,但我无法使用该管理员用户名和密码登录。

我应该在MySQL中采用不同的方式吗?

1 个答案:

答案 0 :(得分:1)

HMAC不是通过连接计算的,而是如下(有关详细信息,请参阅链接)。

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

但是,顾名思义,它是一个消息验证代码,而不是密码散列方案。设计用于密码散列的算法将是更好的选择。 scryptbcryptPBKDF2将是一个不错的选择。