加密/解密与MySQL数据库之间的密码

时间:2011-02-20 18:47:52

标签: php mysql encryption

我开始为我的网站创建一个用户系统,我想要做的是加密密码而不是纯文本。我正在使用PHP / MySQL,所以我认为crypt()是一个很好的起点。但是,我对这样的密码学并不陌生,而且我很难理解它是如何工作的。有没有人知道如何在最简单的层面上实现密码存储为加密字符串的方式,但始终能够解密,而不会出现安全问题?

7 个答案:

答案 0 :(得分:6)

密码应该经过哈希处理,而不是加密。也就是说,您不应该删除密码。相反,你应该比较哈希。

  1. 用户设置密码$password = 'hX4)1z'
  2. 您获得密码哈希并存储到DB:
  3. $pw = hash_hmac('sha512', 'salt' . $password, $_SERVER['site_key']);
    mysql_query('INSERT INTO passwords (pw) VALUES ('$pw');
    
    1. 客户稍后回来。他们输入了密码,然后对它进行比较:
    2. mysql_query('SELECT pw FROM passwords WHERE user_id = ?');
      //$pw = fetch
      
      if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) {
      
         echo "Logged in";
      
      }
      

答案 1 :(得分:2)

PHP有一些内置函数,例如md5()。当我在学习时,我发现IBM's primer非常有用 - 我强烈建议你这样做。

顺便说一句,我建议反对解密密码。唯一应该知道密码的人是用户!这就是为什么我们存储我们可以检查的密码版本的密码,而不是存储可以解密的加密密码。

答案 2 :(得分:2)

我注意到人们就存储密码做了大量的交易。

同意您不应将密码存储为纯文本,但如果您存储单向散列并删除密码,黑客仍然可以使用算法来破解哈希散列字符串并进行比较。

此外,如果您使用可以在以后解密的算法进行加密,那么也可以通过计算加密算法来进行攻击。

我认为,只要没有人能够直接看到用户的密码,你只是让黑客难以为好,但是人们说你不应该加密,因为它可以被解密,但这是不公平的,因为任何东西都可以被黑了。

答案 3 :(得分:1)

答案 4 :(得分:1)

您可以使用md5或更好的散列技术,如sha1 有关详细信息,请参阅密码哈希http://phpsec.org/articles/2005/password-hashing.html

答案 5 :(得分:1)

我建议使用带盐的SHA2来存储密码。

要创建SHA2哈希,请使用:

$hash = hash("sha512", $password.$salt);

在包含彩虹表(密码数据库及其哈希值)之前,盐包含一些额外的字符要添加到您的密码中。您可以使用唯一的用户信息(如user_id)创建一个,或者只创建一个随机的用户信息并将其存储在某个地方。只要确保盐足够长。

不要再使用MD5了;它太老了。有关详细信息,请参阅http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities

编辑:这些是单向散列算法。您可以而且不应该能够解密密码。如果可以的话,那么使用哈希来存储密码是没有意义的。

答案 6 :(得分:1)

不,存储加密密码的位置始终存在安全问题。这就是为什么网站永远不会存储密码的哈希值而不是密码本身。当有人在您的网站上注册并输入密码时,您将存储密码的哈希值(MD5或SHA1或其他任何内容,如上所述)。当他们稍后登录时,您再次散列他们输入的密码(通过与存储时相同的方法)并进行比较。如果哈希是相同的,那么密码是相同的(很有可能!)任何允许你恢复密码的网站都是一个不安全的网站。