代码之家  ›  专栏  ›  技术社区  ›  Wes

MySQL密码函数

  •  16
  • Wes  · 技术社区  · 16 年前

    使用MySQL的password函数散列应用程序使用的密码被认为是好的还是坏的做法?我能看到正反两面。我很好奇,是否有一个关于它是好是坏的普遍共识。

    4 回复  |  直到 16 年前
        1
  •  24
  •   Bill Karwin    15 年前

    MySQL的文档 PASSWORD()

    MySQL服务器中的认证系统使用PASSWORD()函数;您不应该在自己的应用程序中使用它。

    阅读“ You're Probably Storing Passwords Incorrectly “获取有关散列和存储密码的更好建议。

    我为MySQL提供了一个补丁来支持 SHA2() 但由于他们的路线图已经改变,所以还不清楚什么时候它会成为一个发布的产品。

    hash() 功能。

    更新: MySQL 5.5.8于2010年12月发布,该版本包含对 SHA2()

        2
  •  10
  •   davek    16 年前

    如果您使用数据库函数散列密码,则根据定义,密码必须未经加密地到达数据库:因此,我更愿意在更接近“源”的位置(即在前端应用程序中)执行此操作,这样您就不会传递暴露的信息。

        3
  •  6
  •   davethegr8 Community Driven Business    16 年前

    PASSWORD MySQL中的函数是不安全的,并且已经被破坏,但是我现在找不到链接。我认识那个老的( OLD_PASSWORD 在5和以上)是绝对不安全的。

    当然,所有的密码都应该用盐来储存(为了更隐蔽)。例子:

    UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54
    

    MD5 功能,但随着大型彩虹表的兴起,它作为完全混淆存储密码的方式并不是100%可靠。

    更好的方法是在密码到达数据库之前对其进行散列(使用salt)。例子:

    <?php
    $password = sha1(SALT.$_POST["password"]);
    $sql = "UPDATE users SET password='".$password."' WHERE id=54";
    ?>
    
        4
  •  2
  •   Kshitiz Bathwal    7 年前

    介绍 在不涉及太多技术和数学细节的情况下,解释一下两者之间的区别可能会有用 , ,及 腌制 .

    加密 加密已经存在很长时间了。埃及人用它来创造神秘和娱乐,罗马人用它来传递秘密信息。当你加密一个密码时,你会应用某种算法将其置乱。应用钥匙,解读它。

    别喝这酒。 =Qba'g qevax gur jvar。

    服务器对数据进行加密,通过安全的SSL连接将其发送到您的浏览器,浏览器对数据进行解密,以便您可以读取数据。

    散列与加密的不同之处在于,数据一旦编码,就无法解码。嗯,至少要做到这一点非常困难。与加密不同,输出总是固定长度的,具体取决于您使用的算法。

    使用我们之前的短语和我们得到的MD5算法。。。

    =b290557177ec5dd7098d1de84616dd04 如果我们尝试一个较长的短语。。。

    请不要喝这酒,它尝起来糟透了。 您将看到结果都是相同的长度。这意味着,多个输入可以产生相同的输出,称为 碰撞 .

    散列函数还可以用来测试信息是否被篡改。发送电子邮件时,您首先共享一个只有您和收件人知道的秘密值。在发送电子邮件之前,请使用您的机密值对其进行签名并生成哈希值。然后将明文电子邮件(不带机密值)与哈希值一起发送。然后,你的朋友可以执行相同的过程,如果哈希值相同,那么他们就知道你的消息没有被篡改。这种技术称为消息身份验证码或基于哈希的消息身份验证码。

    散列算法的一个重要因素是它们只能以一种方式工作。计算出原始值的唯一方法是使用暴力。尝试多个值以查看它们是否生成相同的哈希。

    这对于通常很短且使用常见单词的密码尤其有问题。现代计算机不需要很长时间就可以通过一个大字典(或使用现有的彩虹表)计算出每个常用密码的哈希结果。

    腌制 除了堵塞动脉外,盐还会堵塞任何试图破解散列密码的人。它们的工作原理是在输入的末尾添加一个额外的秘密值,从而延长原始密码的长度。

    假设你的密码是rocky,salt值是i.love.salt。散列值将由这两个加在一起的rockyi.love.salt组成。这为那些使用常用词作为密码的人提供了一些保护。然而,如果有人知道你使用的盐分值,那么他们只是将它添加到他们在攻击中尝试的每个字典单词的末尾(或开头)。

    为了使这更困难,您可以使用随机密码,每个密码一个。显然,它需要存储在与用户帐户匹配的数据库中,但它确实使暴力攻击变得更加困难。最后,您可以从多个部分创建salt,您可以使用当前日期时间、用户名、密码、随机值或所有这些的组合。