扣丁学堂PHP培训简述PHP中常见的密码处理方式

"\u003Cdiv\u003E\u003Cp\u003E本篇文章扣丁学堂\u003Cstrong\u003EPHP培训\u003C\u002Fstrong\u003E小编给小伙伴们介绍一下关于PHP中常见的密码处理方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴就随小编一起来了解一下吧。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002Fbbb6ebcc7720413591e715a044455d3f\" img_width=\"409\" img_height=\"319\" alt=\"扣丁学堂PHP培训简述PHP中常见的密码处理方式\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E在使用PHP开发Web应用的中,很多的应用都会要求用户注册,而注册的时候就需要我们对用户的信息进行处理了,最常见的莫过于就是邮箱和密码了,本文意在讨论对密码的处理:也就是对密码的加密处理。\u003C\u002Fp\u003E\u003Cp\u003E密码安全的重要性我们就不用再去强调,随着在线攻击的增多,如果我们对密码没有进行合适的处理或做防御措施,我们的应用就会肯定会收到来自各方的威胁和攻击。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E关于密码我们应该遵守的一些原则\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E1、绝对不能知道用户的密码\u003C\u002Fp\u003E\u003Cp\u003E我们绝对不能知道用户的密码,也不能有获取用户密码的方式。\u003C\u002Fp\u003E\u003Cp\u003E知道的越少(包括我们开发者自己)越安全。\u003C\u002Fp\u003E\u003Cp\u003E2、绝对不去约束用户的密码\u003C\u002Fp\u003E\u003Cp\u003E最好不要去约束密码的长度、格式等。\u003C\u002Fp\u003E\u003Cp\u003E如果要求密码符合一个特定的模式,其实对于那些不怀好意的人也提供了攻击的途径。\u003C\u002Fp\u003E\u003Cp\u003E如果必须要约束的话,建议只限制最小长度。并把常用的密码或基于字典创建的密码加入黑名单,也是一个好主意。\u003C\u002Fp\u003E\u003Cp\u003E3、绝对不通过电子邮件发送用户的密码\u003C\u002Fp\u003E\u003Cp\u003E对于一个web应用来说,重置或修改密码时,我们应该在邮件里发送用于设定或修改密码的 URL 。而且这个URL中应该会包含一个唯一的令牌,这个令牌只能在设定或修改密码时使用一次。在设定或修改密码之后,我们就应该把这个令牌置为失效。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E使用bcrypt计算用户密码的哈希值\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E目前,通过大量的审查,最安全的哈希算法是 bcrypt 。\u003C\u002Fp\u003E\u003Cp\u003E首先,我们明确两个概念,哈希、加密。哈希和加密有什么区别?\u003C\u002Fp\u003E\u003Cp\u003E加密\u003C\u002Fp\u003E\u003Cp\u003E加密是双向算法,加密的数据之后通过解密还可以得到。\u003C\u002Fp\u003E\u003Cp\u003E哈希\u003C\u002Fp\u003E\u003Cp\u003E哈希是单向算法,哈希后的数据不能再还原成原始值。\u003C\u002Fp\u003E\u003Cp\u003E哈希算法的用途,\u003C\u002Fp\u003E\u003Cp\u003E验证数据的完整性(要求算法速度快)\u003C\u002Fp\u003E\u003Cp\u003E用户提高密码等需要单向验证的数据的安全性(要求安全性高,甚至故意要求时间慢)\u003C\u002Fp\u003E\u003Cp\u003E一般我们在数据库中保存的应该是计算出来的密码的哈希值。这样即使我们的数据库泄露了,他们也只能看到这些无意义的密码的哈希值。\u003C\u002Fp\u003E\u003Cp\u003E哈希的算法有很多种。\u003C\u002Fp\u003E\u003Cp\u003EMD5\u003C\u002Fp\u003E\u003Cp\u003EMD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。\u003C\u002Fp\u003E\u003Cp\u003ESHA1\u003C\u002Fp\u003E\u003Cp\u003E安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要,(但会有1x10 ^ 48分之一的机率出现相同的消息摘要,一般使用时忽略)。\u003C\u002Fp\u003E\u003Cp\u003Ebcrypt\u003C\u002Fp\u003E\u003Cp\u003Ebcrypt是专门为密码存储而设计的算法,基于Blowfish加密算法变形而来,由Niels Provos和David Mazières发表于1999年的USENIX。 bcrypt最大的好处是有一个参数(work factor),可用于调整计算强度,而且work factor是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大work factor,而且不会影响已有用户的登陆。 bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此我们建议使用这种方式存储密码。\u003C\u002Fp\u003E\u003Cp\u003Escrypt\u003C\u002Fp\u003E\u003Cp\u003Escrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持 。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。\u003C\u002Fp\u003E\u003Cp\u003E目前,通过大量的审查,最安全的哈希算法是 bcrypt 。与 MD5 和 SHA1 不同, bcrypt 算法会自动加盐,来防止潜在的彩虹表攻击。 bcrypt 算法会花费大量的时间反复处理数据,来生成安全的哈希值。在这个过程中,处理数据的次数叫工作因子(work factor)。工作因子的值越高,破解密码哈希值的时间会成指数倍增长。\u003C\u002Fp\u003E\u003Cp\u003Ebcrypt 算法永不过时,如果计算机的运算速度变快了,我们只需要提高工作因子即可。\u003C\u002Fp\u003E\u003Cp\u003E顺带说一下,任何情况下尽可能的不要使用 md5 算法,至少也要使用 SHA 系列的哈希算法。因为md5算法以目前计算机的计算能力来说显得比较简单,而 md5 的性能优势现在也已经完全可以忽略不计了。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E密码哈希API\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E上面我们说到 bcrypt 算法最安全,最适合对我们的密码进行哈希。 PHP 在 PHP5.5.0+ 的版本中提供了原生的密码哈希API供我们使用,这个密码哈希API默认使用的就是 bcrypt 哈希算法,从而大大简化了我们计算密码哈希值和验证密码的操作。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003EPHP原生密码哈希API\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E密码哈希函数:\u003C\u002Fp\u003E\u003Cp\u003Epassword_get_info\u003C\u002Fp\u003E\u003Cp\u003E返回指定的哈希值的相关信息\u003C\u002Fp\u003E\u003Cp\u003Epassword_hash\u003C\u002Fp\u003E\u003Cp\u003E创建密码的哈希(hash)\u003C\u002Fp\u003E\u003Cp\u003Epassword_needs_rehash\u003C\u002Fp\u003E\u003Cp\u003E检查给定的哈希是否与给定的选项匹配\u003C\u002Fp\u003E\u003Cp\u003Epassword_verify\u003C\u002Fp\u003E\u003Cp\u003E验证密码是否和哈希匹配\u003C\u002Fp\u003E\u003Cp\u003E想要了解更多关于PHP开发方面内容的小伙伴,请关注扣丁学堂PHP培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的PHP讲师为您指导,此外扣丁学堂老师精心推出的\u003Cstrong\u003EPHP视频教程\u003C\u002Fstrong\u003E定能让你快速掌握PHP从入门到精通开发实战技能。扣丁学堂PHP技术交流群:374332265。\u003C\u002Fp\u003E\u003Cp\u003EPyhon基础课程:https:\u002F\u002Fke.qq.com\u002Fcourse\u002F327534?flowToken=1008607 【扫码进入Python全栈开发免费公开课】\u003C\u002Fp\u003E\u003Cp\u003EH5基础课程:https:\u002F\u002Fke.qq.com\u002Fcourse\u002F320523?flowToken=1008606【扫码进入HTML5前端开发VIP免费公开课】\u003C\u002Fp\u003E\u003Cp\u003EJavaVIP课程:https:\u002F\u002Fke.qq.com\u002Fcourse\u002F308771?taid=3521851708192291【扫码进入JavaEE\u002F微服务VIP免费公开课】\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E注:点击(了解更多)进入课程直播间\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E"
发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();