作者:hi347 | 来源:互联网 | 2023-01-20 11:41
我一直在研究将我的密码加密到mySQL数据库的最佳方法,但我无法确定密码的最佳加密方式.
md5(
据说由于各种安全原因我不知道有缺陷,但是以某种方式被WordPress使用.为什么这个功能如此受到批评?
sha1()
只是受到md
计算复杂性更强的系列启发的另一个功能.
password()
似乎建议使用.
和PASSWORD()
MySQl
然后,hash()
在PHP 5.1.2中使用的新功能.和更新的版本
MySQl PASSWORD()
与上面提到的其他php函数有什么不同?
1> Binarus..:
首先,请注意,大多数人不加密(如你写的)密码到他们的数据库.加密,无论是对称的还是非对称的,意味着可以再次解码数据.加密密码将是一个非常糟糕的概念(至少如果所有这些密钥都存在公共密钥),因为解密密钥必须存储在某个地方,如果攻击者得到它们,他可以立即解密所有密码.
你想做什么叫做散列.密码的哈希值是通过对密码应用散列函数从密码派生的.这里的关键点是这个过程无法恢复,即没有数学方法可以从哈希中获取密码.
说完这个:
MySQL SET PASSWORD
和PASSWORD()
被弃用了.它们将在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()
,但它也被弃用了.MySQL也有一个SHA2()
功能,但如上所述,这可能还不够.不幸的是,MySQL的(据我所知)没有提供BCRYPT()
,PBKDF2()
,SCRYPT()
或任何其他知名缓慢的哈希函数.
由于您应该使用慢速哈希算法之一,并且由于操作系统crypt()
(在大多数情况下)和MySQL都没有提供任何一种,因此您应该在后端应用程序中进行哈希处理.如上所述,我不知道PHP,但我很确定至少有一个众所周知的慢哈希算法(它不依赖于底层操作系统的/ libc crypt()
)的实现.
顺便说一下,散列算法的各种实现之间的结果没有差异.例如,如果使用您喜欢的编程语言将SHA512应用于字符串,则结果将与使用MySQL将SHA512应用于同一字符串相同.其他散列算法也是如此,包括慢速算法.但是,可能存在性能差异.
这基本上意味着,如果您现在在应用程序后端进行散列,只要MySQL提供您正在使用的慢速散列算法,就可以在MySQL中稍后执行此操作.您可以在应用程序后端中的散列和数据库中的散列之间切换,而无需重新计算所有存储的散列并且不会丢失数据.
其他经验法则:
在完全理解我给出的所有参考文献之前,甚至不要考虑实施自己的登录/密码系统.
如果由于某种原因被迫使用任何其他散列算法而不是慢速算法,请始终使用salting,当然每个密码使用不同的盐.虽然有些人宣称这没用,但我不这么认为.它仍然会使攻击更加困难(与没有盐的哈希相比).但是对于快速哈希算法的攻击,例如来自SHA-2系列的算法,无论是否使用盐,与针对其中一种慢速哈希算法的攻击相比,仍然非常容易和有效.
最后,这是一篇博客文章,可以帮助您入门.这将让你对重要的事情有所了解,但你必须做进一步的研究(现在是四年之后......).