我一直在研究将密码加密到mySQL数据库的最佳方法,但我还没有能够确定密码的最佳加密方式。
md5(
)因为各种安全原因据说是有缺陷的,我不知道,但是以某种方式被WordPress使用。为什么这个功能如此受到批评?
sha1()
只是受md
启发的另一个功能系列,计算复杂度更高。
password()
。
和MySQl中的PASSWORD()
然后,在PHP 5.1.2中使用的新函数hash()
。和更新的版本
MySQl PASSWORD()
与上面提到的其他php函数有什么不同?
答案 0 :(得分:5)
首先,请注意,大多数人都没有加密(如你所写)密码到他们的数据库中。加密,无论是对称的还是非对称的,意味着可以再次解码数据。加密密码将是一个非常糟糕的概念(至少如果所有这些密钥都存在公共密钥),因为解密密钥必须存储在某个地方,如果攻击者得到它们,他可以立即解密所有密码
您想要做的是哈希。密码的哈希值是通过对密码应用散列函数从密码派生的。这里的关键点是这个过程无法恢复,即没有数学方法可以从哈希中恢复密码。
说完这个:
不推荐使用MySQL的SET PASSWORD
和PASSWORD()
。 They will be removed in future versions of MySQL.如果您希望应用程序与未来版本的MySQL一起运行,请不要使用SET PASSWORD
和PASSWORD()
。
MD5和SHA1绝对不是要走的路;他们被认为是破碎的。
SHA-2系列(例如SHA256,SHA512)在数学意义上被认为是安全的。然而,它具有低计算成本/高速度,而今天的消费者GPU可以每秒计算数十亿的SHA-2哈希值。因此,对于散列密码,其他散列函数(如bcrypt
,pbkdf2
或scrypt
(我目前最喜欢的)是合适的;它们设计得很慢(调整速度有多慢,这是未来的一大优势)和(如果是scrypt)消耗大量内存,这使得基于硬件(ASIC,FPGA)的攻击更加困难。
我不懂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。