Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php openssl_摘要vs哈希vs哈希_hmac?盐与水的区别;HMAC?_Php_Security_Passwords_Hash - Fatal编程技术网

Php openssl_摘要vs哈希vs哈希_hmac?盐与水的区别;HMAC?

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用于向应该加密或散列的文本添加

我想使用SHA512来存储密码。要做到这一点,我应该使用
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(最简单的方法:简单地做
小写(用户名)+密码),但问题是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