Php openssl_摘要vs哈希vs哈希_hmac?盐与水的区别;HMAC?
我想使用SHA512来存储密码。要做到这一点,我应该使用Php openssl_摘要vs哈希vs哈希_hmac?盐与水的区别;HMAC?,php,security,passwords,hash,Php,Security,Passwords,Hash,我想使用SHA512来存储密码。要做到这一点,我应该使用openssl\u digest、hash和hash\u hmac中的哪一个?为什么 SALT和HMAC之间有什么区别 我刚刚读到HMAC是建立在哈希函数之上的 所以,SHA512+SALT+HMAC真的有必要吗,或者SHA512+SALT或者SHA512+HMAC?是使用哈希算法的一种特定方式(如SHA512)。它用于对消息进行签名,然后您可以验证消息是否来自特定的签名者且未被更改。所以这不是你想要的 A用于向应该加密或散列的文本添加
openssl\u digest
、hash
和hash\u hmac
中的哪一个?为什么
SALT
和HMAC
之间有什么区别
我刚刚读到HMAC是建立在哈希函数之上的 所以,
SHA512+SALT+HMAC
真的有必要吗,或者SHA512+SALT
或者SHA512+HMAC
?是使用哈希算法的一种特定方式(如SHA512)。它用于对消息进行签名,然后您可以验证消息是否来自特定的签名者且未被更改。所以这不是你想要的
A用于向应该加密或散列的文本添加一点“随机性”。关键是,即使对同一文本进行多次加密,也会得到不同的结果。这使得进行一些攻击变得更加困难。这就是您想要的:SHA512(salt+密码)
对于存储密码,我能想到的最安全的方式是:
(免责声明:我对加密技术不是很有经验,可能有更好的解决方案)
- 客户端(JavaScript代码?)将生成salt值
- 然后,客户端将salt和密码结合起来,并通过哈希算法运行结果
- 然后,客户机将salt和hash值传输到存储它的服务器(最好在不同的位置)
- 把盐递给客户
- 客户端将salt和输入的密码结合起来,通过哈希算法运行它
- 客户端将哈希值发送到服务器
- 服务器将哈希值与存储的哈希值进行比较。如果它们匹配,则是相同的密码
小写(用户名)+密码),但问题是salt是可预测的,因此会稍微削弱您的解决方案。然而,它仍然比传输“原始”散列要好得多,您甚至不需要存储盐,因为您每次都可以从用户名派生盐。如果您的密码数据库被偷,它仍然可以通过这种“用户名盐渍”方法抵抗彩虹表攻击
问题是中间人攻击仍然是可能的。如果攻击者截获用户名并对其进行哈希运算,那么它就拥有所有相关信息,与传输明文密码没有任何区别。因此,您可能希望使用SSL(HTTPS)保护连接。因此,首先,让我们澄清一件事openssl_digest()
==hash()
。这只是另一个名字不同的函数,它做的事情完全一样。它计算输入的加密散列
所以,现在我们有了一个问题:在存储密码时,哪个更好:hash
还是hash\u hmac
简短答复:
都不是
长答覆:
事实证明。仅仅使用hash($password.$salt)
甚至hash\hmac($password,$salt)
都不足以存储密码。时期如果你这样做,现在就停止
原因很简单:计算机(或GPU)上的计算时间非常便宜。它是如此的便宜,以至于暴力使用一系列密码是非常便宜的,你需要担心它。记住,散列函数的设计是为了快速。不贵
但是,事实也证明,有一种方法可以让那些快速散列函数变得更昂贵。事实上,它非常简单:迭代
现在,我知道你在想什么了。您只需在哈希上循环:
function hash_password($password, $salt) {
$hash = hash("sha512", $password . $salt);
for ($i = 0; $i < 1000; $i++) {
$hash = hash("sha512", $hash);
}
}
这实际上是基本的内部循环
但我们能变得更好吗
是的,同样,我们可以变得更好。如果我们仔细观察,我们可以看到,除了密码和salt之外,上述所有算法都使用非常少的内存。在sha512中,他们将使用128到256字节(缓冲区和状态)来散列密码。由于内存使用量很小,所以在GPU中同时并行运行大量内存是很简单的。如果我们能增加内存使用率
事实证明,我们可以简单地使用bcrypt
,这是一种自适应哈希算法。它的一个优点是比上述算法使用更多的内存(大约4到5kb)。因此,并行化的阻力更大。而且,由于计算成本很高,它抵制暴力强迫
幸运的是,它可用于PHP:
crypt($password, '$2y$07$usesomesillystringforsalt$')
请注意,crypt()
使用了许多算法,但是$2y$
和$2a$
算法是bcrypt
但我们能在这方面有所改进吗
有点。有一种相对较新的算法叫做。它比bcrypt好,因为它在计算上同样昂贵,但使用了更多的内存(散列单个密码的内存大约为20mb到40mb)。因此,它甚至更抵制并行化
不幸的是,scrypt
在PHP中还不可用(我正在努力改变这一点)。在此之前,请使用bcrypt
旁注
在最近从、、等中学到的教训之后,很明显有证据表明,很多人都做错了。不要做错了,使用一个经过审查的算法库。使用CRYPT\u河豚
(bcrypt),使用PHPASS,使用。但不要仅仅因为你不想产生依赖就发明你自己的。。。那只是疏忽
更多阅读:
根据IT安全专家的说法:
function hash_password($password, $salt) {
$hash = hash_hmac("md5", $salt, $password);
for ($i = 0; $i < 1000; $i++) {
$hash = hash_hmac("md5", $hash, $password);
}
}
crypt($password, '$2y$07$usesomesillystringforsalt$')
openssl_digest vs hash vs hash_hmac
SALT vs HMAC