【问题标题】:Encrypting/Decrypting Passwords to and from a MySQL database加密/解密与 MySQL 数据库之间的密码
【发布时间】:2011-06-30 20:34:38
【问题描述】:

我开始为我的网站创建一个用户系统,我想做的是加密密码,而不是明文。我正在使用 PHP/MySQL,所以我认为 crypt() 是一个不错的起点。但是,我对这样的密码学是全新的,我很难理解它是如何工作的。有谁知道如何以最简单的方式实现一种将密码存储为加密字符串的方法,但始终能够解密,而不会出现安全问题?

【问题讨论】:

  • 这已经写了很多次了,尤其是在最近的 Gawker 妥协之后。我建议你在谷歌上搜索“密码哈希和加盐”之类的术语,做一些阅读,如果你有具体问题,然后再回到 SO。
  • 完全有效的问题!请记住,当您搜索技术信息时,您通常会被定向到 stackoverflow

标签: php mysql encryption


【解决方案1】:

密码应该是散列的,而不是加密的。也就是说,您不应该能够解密密码。相反,您应该比较哈希值。

  1. 用户设置密码$password = 'hX4)1z'
  2. 您获得密码哈希并存储到数据库:

#

$pw = hash_hmac('sha512', 'salt' . $password, $_SERVER['site_key']);
mysql_query('INSERT INTO passwords (pw) VALUES ('$pw');
  1. 客户稍后回来。他们输入密码,然后您进行比较:

#

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";

}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • md5 不是加密,它是一个哈希函数。 (不应该)没有办法将 md5 哈希转换回密码
    • 正确,感谢您指出这一点。修改了迂腐的原始答案。
    【解决方案3】:

    我注意到人们在存储密码方面做了很多交易。

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

    此外,如果您使用稍后可以解密的算法进行加密,则也可以通过找出加密算法来破解。

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

    【讨论】:

      【解决方案4】:
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        要创建 SHA2 哈希,请使用:

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

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

        不要再使用MD5了;它很旧。请参阅http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities 了解更多信息。

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

        【讨论】:

          【解决方案7】:

          不,关于存储加密密码的位置总是存在安全问题。这就是为什么网站从不存储密码的哈希值而不是密码本身的原因。当有人在您的网站上注册并输入密码时,您将存储密码的哈希值(MD5 或 SHA1 或其他任何内容,如上所述)。当他们稍后登录时,您再次对他们输入的密码进行哈希处理(使用存储密码时使用的相同方法)并进行比较。如果哈希值相同,则密码相同(很有可能!)任何让您恢复密码的网站都是不安全的网站。

          【讨论】:

            猜你喜欢
            • 2014-06-24
            • 1970-01-01
            • 2019-10-24
            • 2019-03-17
            • 1970-01-01
            • 2020-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多