Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQl数据库中使用哪种方法加密密码?_Php_Mysql_Wordpress_Encryption - Fatal编程技术网

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

Php 在MySQl数据库中使用哪种方法加密密码?,php,mysql,wordpress,encryption,Php,Mysql,Wordpress,Encryption,我一直在研究将我的密码加密到mySQL数据库中的最佳方法,但我还无法确定密码的最佳加密方式 md5()据说是有缺陷的,因为我不知道各种安全原因,但WordPress不知怎么地使用了它。为什么这一职能受到如此批评 sha1()只是另一个受md系列启发的函数,具有更高的计算复杂性 password()似乎建议使用 以及MySQl中的密码() 然后,新函数hash()在PHP5.1.2中开始使用。和更新版本 MySQlPASSWORD()与上面提到的其他php函数有什么不同?像md5和sha1这样

我一直在研究将我的密码加密到mySQL数据库中的最佳方法,但我还无法确定密码的最佳加密方式

  • md5(
    )据说是有缺陷的,因为我不知道各种安全原因,但WordPress不知怎么地使用了它。为什么这一职能受到如此批评

  • sha1()
    只是另一个受
    md
    系列启发的函数,具有更高的计算复杂性

  • password()
    似乎建议使用

  • 以及MySQl中的
    密码()

  • 然后,新函数
    hash()
    在PHP5.1.2中开始使用。和更新版本


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

像md5和sha1这样的简单哈希之所以不太安全,是因为现在的计算能力很容易被破解,所以应该使用带盐的哈希。[这是对你问题的一个很好的回答] ()


WordPress不再使用MD5,WordPress使用的是PasswordHash函数。

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

你要做的就是所谓的散列。密码的哈希是通过对密码应用哈希函数从密码派生的。这里的关键点是这个过程不能恢复,即没有数学方法从散列中获取密码

话虽如此:

  • MySQL的
    SET PASSWORD
    PASSWORD()。如果希望应用程序与MySQL的未来版本一起运行,请不要使用
    SET PASSWORD
    PASSWORD()

  • MD5和SHA1绝对不是要走的路;它们被认为是坏的

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

我不懂PHP,但大多数语言都有一个名为
crypt()
encrypt()
之类的函数,它使用底层O/S的
crypt()
API(在Linux:glibc中),因此您可以将其作为一个起点,但前提是它已经提供了一种慢速哈希算法(大多数情况下并非如此)

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

由于您应该使用一种慢速散列算法,而且操作系统的
crypt()
(在大多数情况下)和MySQL都不提供任何一种算法,因此您应该在后端应用程序中进行散列。如上所述,我不懂PHP,但我非常确定至少有一种著名的慢速哈希算法(它不依赖于底层操作系统/libc的
crypt()
)的实现

顺便说一句,关于散列算法的不同实现之间的结果不会有任何差异。例如,如果使用您最喜欢的编程语言将SHA512应用于字符串,结果将与使用MySQL将SHA512应用于同一字符串的结果相同。其他散列算法也是如此,包括慢散列算法。不过,可能存在性能差异

这基本上意味着,如果您现在在应用程序后端进行散列,那么只要MySQL提供您正在使用的慢速散列算法,您就可以稍后在MySQL中进行散列。您可以在应用程序后端的散列和数据库中的散列之间来回切换,而无需重新计算所有存储的散列,也不会丢失数据

其他经验法则:

  • 在您完全理解我提供的所有参考资料之前,甚至不要考虑实施您自己的登录/密码系统

  • 如果您出于某种原因被迫使用除慢速散列算法之外的任何其他散列算法,始终使用salt,当然每个密码使用不同的salt。虽然有些人宣称这是无用的,但我不这么认为。它仍然会使攻击更加困难(与无盐哈希相比)。但是,与针对其中一种慢速散列算法的攻击相比,针对SHA-2家族的快速散列算法的攻击,无论是否使用盐,都将非常容易和有效


最后,这应该让你开始。这会让你感觉到什么是重要的,但你还需要做进一步的研究(现在已经四年了……。

访问post@Nikhil Baby提供并阅读password_hash()和password_verify()。谢谢你的回答,我一直在寻找这个答案。答案不错,但有点误导。阅读你的答案会让人觉得你是在推荐生SHA作为方法