0

我正在从事一个项目,并热衷于从一开始就保证密码存储的安全。在构思阶段,但这大致是我打算使用的。

class Crypto {
    public function hash1($string, $salt) {
        return hash('sha512', $string . $salt);
    }

    public function hash2($string, $salt) {
        return hash('sha512', $salt . $string);
    }

    public function compareToHash($string, $salt, $hash1, $hash2) {
        return($this->hash1($string, $salt) === $hash1 && $this->hash2($string, $salt) === $hash2);
    }
}

如您所见,我试图避免碰撞。这是一种有效的方法吗,它看起来非常简单,我想知道我是否遗漏了什么。

谢谢。

4

4 回答 4

0

If you want to make your password storage secure from the start, you should not use sha512 or any other fast hash algorithm, instead use a key derivation function like BCrypt.

The problem with fast algorithms is, that you can calculate 80 Mega sha512-hashes per second with common hardware (in 2012). That makes it possible to brute-force a whole english dictionary with about 500000 words, in a few milliseconds! Other algorithms are even faster.

BCrypt was especially designed to hash passwords, and is therefore slow (needs some computing time). With a cost factor you can adapt the needed time to future (and therefore faster) hardware.

Using BCrypt can be as easy, as using the sha512 hash. It's recommended to use a well established library like phpass, and if you want to understand how it can be implemented, you can read this article, where i tried to explain the most important points.

Your scheme with two separate hashes will not increase security, because collisions with sha512 are never the problem. In the worst case it even weakens security, because you have to store both hashes, so an attacker has two related informations about the hashed password.

于 2012-10-20T18:55:31.870 回答
0

由于您计划对可能的网站进行密码保护,让我解释一下,您需要确保从已经编码的客户端发送密码,否则任何嗅探器都会找到真正的密码,并且您知道人们通常如何使用密码,对吧?在许多许多帐户上都是一样的。

我建议看一下我前段时间偶然发现的一篇文章,并为它保留了一个链接,因为它解释了哈希和密码保护的所有问题:http: //www.codinghorror.com/blog/2007/09 /rainbow-hash-cracking.html

很快 - 尽可能使用最强(并且 sha1 不再强)密码编码器。不是最快的。让黑客浪费宝贵的时间尝试闯入。如此一来,闯入将变得没有吸引力。

希望它会有所帮助,祝你好运。

于 2012-10-19T21:02:54.663 回答
0

这是非常基本的。我会查看 OWASP 的密码存储备忘单。还有许多已经创建和审查的密码哈希库。

我会看一下 OpenWall 的Portable PHP Hashing Framework。它创建了非常安全的哈希值并执行了适当数量的迭代。它的使用也相当广泛。

如果您使用 SHA512 进行散列,那么您当时不需要做任何特别的事情来避免碰撞,我记得最近读到,在一段时间内发现碰撞仍然不可行。

我将关注的两个主要事情是安全盐(20+ 字节)和迭代哈希至少 64,000 次以增加攻击时间。

于 2012-10-19T21:05:48.430 回答
0

密码安全的第一条规则:如果您不确定某事是否安全,那么很可能不是。

由于您刚刚开始编写密码例程,我的建议是现在停止。

PHP5.5(2013 年 2 月/3 月到期)将附带一组新功能,专为处理密码而设计,并考虑到最佳实践安全性。当 5.5 发布时,这些函数将成为 PHP 中唯一推荐的处理密码的方法。

好消息是,您无需等待或升级到 5.5 即可使用这些功能——它们已被向后移植以在 5.3 和 5.4 中运行,因此您现在可以使用它们。从这里下载库:https ://github.com/ircmaxell/password_compat

参考文章:http ://www.h-online.com/open/news/item/PHP-5-5-should-reduce-password-sloppiness-1707835.html

于 2012-10-19T21:05:56.163 回答