如何在MySQL数据库中加密密码?

12 浏览
0 Comments

如何在MySQL数据库中加密密码?

本问题已在此处有答案

PHP密码的安全哈希和盐

我一直在研究将密码加密到我的mySQL数据库中的最佳方法,但我还没有找到最好的密码加密方法。

  • md5()因为各种安全原因而被认为存在缺陷,具体我不知道,但WordPress某种程度上还是使用了它。为什么这个函数会受到如此批评?
  • sha1()只是另一个受md-系列启发的函数,计算复杂度更高。
  • 似乎建议使用password()
  • MySQl中的PASSWORD()
  • 然后,PHP 5.1.2及更高版本中使用的新函数hash()

MySQl中的PASSWORD()与上述其他php函数有何不同?

admin 更改状态以发布 2023年5月20日
0
0 Comments

简单的哈希函数如MD5和SHA1不太安全,因为现今的计算能力可以轻松地破解它们,你应该使用带盐的哈希函数。[以下是一个伟大的StackOverflow回答,回答了你的问题] (Secure hash and salt for PHP passwords).

WordPress不再使用MD5,而是使用PasswordHash函数,这里有更多关于WordPress的信息

0
0 Comments

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

您想要做的是哈希。密码的哈希是通过将哈希函数应用于密码来得到的。关键点在于,这个过程不能被逆转,即没有数学方法可以从哈希中获取密码。

话虽如此:

  • MySQL的SET PASSWORDPASSWORD()已被弃用。他们将在MySQL的将来版本中被删除。如果您希望您的应用程序在未来的MySQL版本中运行,请不要使用SET PASSWORDPASSWORD()

  • MD5和SHA1绝对不是正确的方法; 它们被认为是有缺陷的。

  • SHA-2家族(例如SHA256,SHA512)在数学上被认为是安全的。尽管如此,它具有低计算成本/高速度,今天的消费级GPU可以每秒计算多亿个SHA-2哈希。因此,对于散列密码,其他散列函数如bcryptpbkdf2scrypt(这是我现在最喜欢的)是适当的; 这些设计为慢(可以调节的速度是未来的重要优势)而(在scrypt的情况下)消耗更多的内存,这使得硬件(ASIC,FPGA)攻击更加困难。

我不知道PHP,但大多数语言都有一个被称为crypt()encrypt()等的函数,它使用底层操作系统(在Linux中:glibc)的crypt() API,因此您可以使用此作为起点,但仅在它已经提供了其中之一的慢哈希算法(这在大多数情况下都不是这种情况)。

MySQL有一个被称为ENCRYPT()的函数,它还使用操作系统的crypt(),但它也已弃用。MySQL也有一个SHA2()函数,但正如上面提到的,这可能还不够。不幸的是,MySQL(据我所知)不提供BCRYPT()PBKDF2()SCRYPT()或任何其他知名的慢哈希函数。

由于您应该使用其中一个慢哈希算法,并且因为无论是操作系统的crypt()还是MySQL都没有提供它们,因此您应该在后端应用程序中执行散列。如上所述,我不知道PHP,但我很确定至少有一种知名的慢哈希算法的实现(它不依赖于底层操作系统/ libc的crypt())。

顺便说一下,哈希算法的各种实现不会影响结果。例如,如果你使用你最喜欢的编程语言对一个字符串应用SHA512,那么结果与你在MySQL上对同一个字符串应用SHA512的结果相同。对于其他哈希算法,包括慢算法,也是如此。但是,它们的性能可能会有所差异。

这基本上意味着,如果你现在在应用程序后端中进行哈希运算,一旦MySQL提供了你正在使用的慢哈希算法,你可以在MySQL中稍后执行相同的操作。你可以在应用程序后端进行哈希运算和在数据库中进行哈希运算之间来回切换,而不必重新计算所有存储的哈希值,也不会丢失数据。

另外一些经验规则:
- 在完全理解我所提供的参考文献之前,不要尝试实现自己的登录/密码系统。
- 如果你被迫使用除慢算法之外的任何其他哈希算法,请始终使用盐,当然每个密码使用不同的盐。虽然有人宣称这是无用的,但我并不这么认为。它仍然会使攻击更加困难(与没有用盐的哈希相比)。但是,对于SHA-2系列之类的快速哈希算法的攻击,无论是否使用盐,都将比对慢哈希算法之一的攻击更加容易和高效。

最后,这里是一篇博客文章,它会让你有个开始的感觉。这会让你了解重要的事情,但你还需要进行进一步的研究(现在已经过去四年了...)。

0