在MySQl数据库中使用哪种方法加密密码?

时间:2017-09-03 05:04:51

标签: php mysql wordpress encryption

我一直在研究将密码加密到mySQL数据库的最佳方法,但我还没有能够确定密码的最佳加密方式。

  • md5()因为各种安全原因据说是有缺陷的,我不知道,但是以某种方式被WordPress使用。为什么这个功能如此受到批评?

  • sha1()只是受md启发的另一个功能系列,计算复杂度更高。

  • 似乎建议使用
  • password()

  • 和MySQl中的PASSWORD()

  • 然后,在PHP 5.1.2中使用的新函数hash()。和更新的版本

MySQl PASSWORD()与上面提到的其他php函数有什么不同?

2 个答案:

答案 0 :(得分:5)

首先,请注意,大多数人都没有加密(如你所写)密码到他们的数据库中。加密,无论是对称的还是非对称的,意味着可以再次解码数据。加密密码将是一个非常糟糕的概念(至少如果所有这些密钥都存在公共密钥),因为解密密钥必须存储在某个地方,如果攻击者得到它们,他可以立即解密所有密码

您想要做的是哈希。密码的哈希值是通过对密码应用散列函数从密码派生的。这里的关键点是这个过程无法恢复,即没有数学方法可以从哈希中恢复密码。

说完这个:

  • 不推荐使用MySQL的SET PASSWORDPASSWORD()They will be removed in future versions of MySQL.如果您希望应用程序与未来版本的MySQL一起运行,请不要使用SET PASSWORDPASSWORD()

  • MD5和SHA1绝对不是要走的路;他们被认为是破碎的。

  • SHA-2系列(例如SHA256,SHA512)在数学意义上被认为是安全的。然而,它具有低计算成本/高速度,而今天的消费者GPU可以每秒计算数十亿的SHA-2哈希值。因此,对于散列密码,其他散列函数(如bcryptpbkdf2scrypt(我目前最喜欢的)是合适的;它们设计得很慢(调整速度有多慢,这是未来的一大优势)和(如果是scrypt)消耗大量内存,这使得基于硬件(ASIC,FPGA)的攻击更加困难。

    < / LI>

我不懂PHP,但大多数语言都有一个名为crypt()encrypt()的函数或类似函数,它使用底层操作系统的crypt() API(在Linux中: glibc),所以你可以用它作为起点,但前提是它已经提供了一种慢速哈希算法(大多数情况并非如此)。

MySQL有一个名为ENCRYPT()的函数,它也使用操作系统的crypt()but it is deprecated as well。 MySQL也有SHA2() function,但如上所述,这可能还不够。不幸的是,MySQL(AFAIK)不提供BCRYPT()PBKDF2()SCRYPT()或任何其他众所周知的慢速散列函数。

由于您应该使用其中一种慢速哈希算法,并且由于操作系统的crypt()(在大多数情况下)和MySQL都没有提供任何一种,因此您应该在后端应用程序中进行哈希处理。如上所述,我不知道PHP,但我确信至少有一个众所周知的慢哈希算法(它不依赖于底层操作系统的/ libc的crypt())。< / p>

顺便说一下,散列算法的各种实现之间的结果没有差异。例如,如果使用您喜欢的编程语言将SHA512应用于字符串,则结果将与使用MySQL将SHA512应用于同一字符串相同。其他散列算法也是如此,包括慢速算法。但是,可能存在性能差异。

这基本上意味着,如果你现在在你的应用程序后端进行散列,你可以在MySQL提供你正在使用的慢散列算法后立即在MySQL中完成。您可以在应用程序后端的散列和数据库中的散列之间进行切换,而无需重新计算所有存储的散列并且不会丢失数据。

其他经验法则

  • 完全了解我提供的所有参考文献之前,不要认为实施您自己的登录/密码系统。

  • 如果由于某种原因被迫使用任何其他散列算法而不是慢速算法,总是使用salting ,当然每个密码使用不同的盐。虽然有些人宣称这没用,但我不这么认为。它仍然会使攻击更加困难(与没有盐的哈希相比)。但是,与针对其中一种慢速哈希算法的攻击相比,对SHA-2系列快速哈希算法(无论是否使用盐)的攻击仍然非常容易和高效。 p>

最后,here is a blog entry应该让你开始。这将让你对重要的事情有所了解,但你必须做进一步的研究(现在已经过去了四年......)。

答案 1 :(得分:0)

像md5和sha1这样简单哈希的原因并不是很安全,因为现在的计算能力很容易破解,你应该使用哈希哈希。 [这是一个很棒的StackOverflow回答你的问题] (Secure hash and salt for PHP passwords)。

WordPress不再使用MD5,WordPress正在使用PasswordHash功能here is more about what WordPress does