当前位置: 首页 > news >正文

炎陵网站建设网站计数器php

炎陵网站建设,网站计数器php,网站开发属于软件开发服务吗,wordpress5.1.1后门利用工具2011年12月21日#xff0c;有人在网络上公开了一个包含600万个CSDN用户资料的数据库#xff0c;数据全部为明文储存#xff0c;包含用户名、密码以及注册邮箱。事件发生后CSDN在微博、官方网站等渠道发出了声明#xff0c;解释说此数据库系2009年备份所用#xff0c;因不明… 2011年12月21日有人在网络上公开了一个包含600万个CSDN用户资料的数据库数据全部为明文储存包含用户名、密码以及注册邮箱。事件发生后CSDN在微博、官方网站等渠道发出了声明解释说此数据库系2009年备份所用因不明原因泄漏已经向警方报案后又在官网发出了公开道歉信。在接下来的十多天里金山、网易、京东、当当、新浪等多家公司被卷入到这次事件中。整个事件中最触目惊心的莫过于CSDN把用户密码明文存储由于很多用户是多个网站共用一个密码因此一个网站密码泄漏就会造成很大的安全隐患。由于有了这么多前车之鉴我们现在做系统时密码都要加密处理。1.密码加密方案进化史最早我们使用类似SHA-256这样的单向Hash算法。用户注册成功后保存在数据库中的不再是用户的明文密码而是经过SHA-256加密计算的一个字符串当用户进行登录时将用户输入的明文密码用SHA-256进行加密加密完成之后再和存储在数据库中的密码进行比对进而确定用户登录信息是否有效。如果系统遭遇攻击最多也只是存储在数据库中的密文被泄漏。这样就绝对安全了吗当然不是的。彩虹表是一个用于加密Hash函数逆运算的表通常用于破解加密过的Hash字符串。为了降低彩虹表对系统安全性的影响人们又发明了密码加“盐”之前是直接将密码作为明文进行加密现在再添加一个随机数即盐和密码明文混合在一起进行加密这样即使密码明文相同生成的加密字符串也是不同的。当然这个随机数也需要以明文形式和密码一起存储在数据库中。当用户需要登录时拿到用户输入的明文密码和存储在数据库中的盐一起进行Hash运算再将运算结果和存储在数据库中的密文进行比较进而确定用户的登录信息是否有效。密码加盐之后彩虹表的作用就大打折扣了因为唯一的盐和明文密码总会生成唯一的Hash字符。然而随着计算机硬件的发展每秒执行数十亿次Hash计算已经变得轻轻松松这意味着即使给密码加密加盐也不再安全。在Spring Security中我们现在是用一种自适应单向函数Adaptive One-way Functions来处理密码问题这种自适应单向函数在进行密码匹配时会有意占用大量系统资源例如CPU、内存等这样可以增加恶意用户攻击系统的难度。在Spring Security中开发者可以通过bcrypt、PBKDF2、scrypt以及argon2来体验这种自适应单向函数加密。由于自适应单向函数有意占用大量系统资源因此每个登录认证请求都会大大降低应用程序的性能但是Spring Security不会采取任何措施来提高密码验证速度因为它正是通过这种方式来增强系统的安全性。当然开发者也可以将用户名/密码这种长期凭证兑换为短期凭证如会话、OAuth2令牌等这样既可以快速验证用户凭证信息又不会损失系统的安全性。2.PasswordEncoder详解Spring Security中通过PasswordEncoder接口定义了密码加密和比对的相关操作public interface PasswordEncoder {String encode(CharSequence rawPassword);boolean matches(CharSequence rawPassword, String encodedPassword);default boolean upgradeEncoding(String encodedPassword) {return false;} } 可以看到PasswordEncoder接口中一共有三个方法encode该方法用来对明文密码进行加密。matches该方法用来进行密码比对。upgradeEncoding该方法用来判断当前密码是否需要升级默认返回false表示不需要升级。针对密码的所有操作PasswordEncoder接口中都定义好了不同的实现类将采用不同的密码加密方案对密码进行处理。2.1 PasswordEncoder常见实现类BCryptPasswordEncoderBCryptPasswordEncoder使用bcrypt算法对密码进行加密为了提高密码的安全性bcrypt算法故意降低运行速度以增强密码破解的难度。同时BCryptPasswordEncoder “为自己带盐”开发者不需要额外维护一个“盐”字段使用BCryptPasswordEncoder加密后的字符串就已经“带盐”了即使相同的明文每次生成的加密字符串都不相同。BCryptPasswordEncoder的默认强度为10开发者可以根据自己的服务器性能进行调整以确保密码验证时间约为1秒钟官方建议密码验证时间为1秒钟这样既可以提高系统安全性又不会过多影响系统运行性能。Argon2PasswordEncoderArgon2PasswordEncoder使用Argon2算法对密码进行加密Argon2曾在Password Hashing Competition竞赛中获胜。为了解决在定制硬件上密码容易被破解的问题Argon2也是故意降低运算速度同时需要大量内存以确保系统的安全性。Pbkdf2PasswordEncoderPbkdf2PasswordEncoder使用PBKDF2算法对密码进行加密和前面几种类似PBKDF2算法也是一种故意降低运算速度的算法当需要FIPSFederal Information Processing Standard美国联邦信息处理标准认证时PBKDF2算法是一个很好的选择。SCryptPasswordEncoderSCryptPasswordEncoder使用scrypt算法对密码进行加密和前面的几种类似scrypt也是一种故意降低运算速度的算法而且需要大量内存。这四种就是我们前面所说的自适应单向函数加密。除了这几种还有一些基于消息摘要算法的加密方案这些方案都已经不再安全但是出于兼容性考虑Spring Security并未移除相关类主要有LdapShaPasswordEncoder、MessageDigestPasswordEncoder、Md4Password Encoder、StandardPasswordEncoder以及NoOpPasswordEncoder密码明文存储这五种皆已废弃这里对这些类也不做过多介绍。除了上面介绍的这几种之外还有一个非常重要的密码加密工具类那就是DelegatingPasswordEncoder。2.2 DelegatingPasswordEncoder根据前文的介绍读者可能会认为Spring Security中默认的密码加密方案应该是四种自适应单向加密函数中的一种其实不然在Spring Security 5.0之后默认的密码加密方案其实是DelegatingPasswordEncoder。从名字上来看DelegatingPasswordEncoder是一个代理类而并非一种全新的密码加密方案。DelegatingPasswordEncoder主要用来代理上面介绍的不同的密码加密方案。为什么采用DelegatingPasswordEncoder而不是某一个具体加密方式作为默认的密码加密方案呢主要考虑了如下三方面的因素兼容性使用DelegatingPasswordEncoder可以帮助许多使用旧密码加密方式的系统顺利迁移到Spring Security中它允许在同一个系统中同时存在多种不同的密码加密方案。便捷性密码存储的最佳方案不可能一直不变如果使用DelegatingPasswordEncoder作为默认的密码加密方案当需要修改加密方案时只需要修改很小一部分代码就可以实现。稳定性作为一个框架Spring Security不能经常进行重大更改而使用Delegating PasswordEncoder可以方便地对密码进行升级自动从一个加密方案升级到另外一个加密方案。那么DelegatingPasswordEncoder到底是如何代理其他密码加密方案的又是如何对加密方案进行升级的我们就从PasswordEncoderFactories类开始看起因为正是由它里边的静态方法createDelegatingPasswordEncoder提供了默认的DelegatingPasswordEncoder实例public class PasswordEncoderFactories {public static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId  bcrypt;MapString, PasswordEncoder encoders  new HashMap();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put(ldap, new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put(MD4, new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put(MD5, new org.springframework.security.crypto.password.MessageDigestPasswordEncoder(MD5));encoders.put(noop, org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put(pbkdf2, new Pbkdf2PasswordEncoder());encoders.put(scrypt, new SCryptPasswordEncoder());encoders.put(SHA-1, new org.springframework.security.crypto.password.MessageDigestPasswordEncoder(SHA-1));encoders.put(SHA-256, new org.springframework.security.crypto.password.MessageDigestPasswordEncoder(SHA-256));encoders.put(sha256, new org.springframework.security.crypto.password.StandardPasswordEncoder());encoders.put(argon2, new Argon2PasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders);}private PasswordEncoderFactories() {} } 可以看到在createDelegatingPasswordEncoder方法中首先定义了encoders变量encoders中存储了每一种密码加密方案的id和所对应的加密类例如bcrypt对应着BcryptPassword Encoder、argon2对应着Argon2PasswordEncoder、noop对应着NoOpPasswordEncoder。encoders创建完成后最终新建一个DelegatingPasswordEncoder实例并传入encodingId和encoders变量其中encodingId默认值为bcrypt相当于代理类中默认使用的加密方案是BCryptPasswordEncoder。我们来分析一下DelegatingPasswordEncoder类的源码由于源码比较长我们就先从它的属性开始看起public class DelegatingPasswordEncoder implements PasswordEncoder {private static final String PREFIX  {;private static final String SUFFIX  };private final String idForEncode;private final PasswordEncoder passwordEncoderForEncode;private final MapString, PasswordEncoder idToPasswordEncoder;private PasswordEncoder defaultPasswordEncoderForMatches  new UnmappedIdPasswordEncoder(); } 首先定义了前缀PREFIX和后缀SUFFIX用来包裹将来生成的加密方案的id。idForEncode表示默认的加密方案id。passwordEncoderForEncode表示默认的加密方案BCryptPasswordEncoder它的值是根据idForEncode从idToPasswordEncoder集合中提取出来的。idToPasswordEncoder用来保存id和加密方案之间的映射。defaultPasswordEncoderForMatches是指默认的密码比对器当根据密码加密方案的id无法找到对应的加密方案时就会使用默认的密码比对器。defaultPasswordEncoderForMatches的默认类型是UnmappedIdPasswordEncoder在UnmappedIdPasswordEncoder的matches方法中并不会做任何密码比对操作直接抛出异常。最后看到的DelegatingPasswordEncoder也是PasswordEncoder接口的子类所以接下来我们就来重点分析PasswordEncoder接口中三个方法在DelegatingPasswordEncoder中的具体实现。首先来看encode方法Override public String encode(CharSequence rawPassword) {return PREFIX  this.idForEncode  SUFFIX  this.passwordEncoderForEncode.encode(rawPassword); } encode方法的实现逻辑很简单具体的加密工作还是由加密类来完成只不过在密码加密完成后给加密后的字符串加上一个前缀{id}用来描述所采用的具体加密方案。因此encode方法加密出来的字符串格式类似如下形式{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG {noop}123 {pbkdf2}23b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4 不同的前缀代表了后面的字符串采用了不同的加密方案。再来看密码比对方法matchesOverride public boolean matches(CharSequence rawPassword, String prefixEncodedPassword) {if (rawPassword  null  prefixEncodedPassword  null) {return true;}String id  extractId(prefixEncodedPassword);PasswordEncoder delegate  this.idToPasswordEncoder.get(id);if (delegate  null) {return this.defaultPasswordEncoderForMatches.matches(rawPassword, prefixEncodedPassword);}String encodedPassword  extractEncodedPassword(prefixEncodedPassword);return delegate.matches(rawPassword, encodedPassword); } private String extractId(String prefixEncodedPassword) {if (prefixEncodedPassword  null) {return null;}int start  prefixEncodedPassword.indexOf(PREFIX);if (start ! 0) {return null;}int end  prefixEncodedPassword.indexOf(SUFFIX, start);if (end  0) {return null;}return prefixEncodedPassword.substring(start  1, end); } 在matches方法中首先调用extractId方法从加密字符串中提取出具体的加密方案id也就是{}中的字符具体的提取方式就是字符串截取。拿到id之后再去idToPasswordEncoder集合中获取对应的加密方案如果获取到的为null说明不存在对应的加密实例那么就会采用默认的密码匹配器defaultPasswordEncoderForMatches如果根据id获取到了对应的加密实例则调用其matches方法完成密码校验。可以看到这里的matches方法非常灵活可以根据加密字符串的前缀去查找到不同的加密方案进而完成密码校验。同一个系统中加密字符串可以使用不同的前缀而互不影响。最后我们再来看一下DelegatingPasswordEncoder中的密码升级方法upgradeEncodingOverride public boolean upgradeEncoding(String prefixEncodedPassword) {String id  extractId(prefixEncodedPassword);if (!this.idForEncode.equalsIgnoreCase(id)) {return true;}else {String encodedPassword  extractEncodedPassword(prefixEncodedPassword);return this.idToPasswordEncoder.get(id).upgradeEncoding(encodedPassword);} } 可以看到如果当前加密字符串所采用的加密方案不是默认的加密方案BcryptPassword Encoder就会自动进行密码升级否则就调用默认加密方案的upgradeEncoding方法判断密码是否需要升级。至此我们将Spring Security中的整个加密体系向读者简单介绍了一遍接下来我们通过几个实际的案例来看一下加密方案要怎么用。以上内容节选自松哥的新书《深入浅出 Spring Security》他和磊哥是老乡也是认识很久的朋友了同时他也是《Spring BootVue全栈开发实战》一书的作者非常低调和务实的技术大佬 最后推荐一波他的新书非常值得一读。彩蛋为了感谢各位读者朋友的长期支持此评论区下留言磊哥送 5 本松哥的新书《深入浅出 Spring Security》需要的小伙伴赶紧留言吧当然脸熟和经常留言的朋友中奖几率更大。
http://www.pierceye.com/news/453805/

相关文章:

  • 强军网网站建设北京各大网站推广服务公司
  • 西安优秀的集团门户网站建设公司网站建设中 优秀账户的标准
  • 网站建设的对比分析移动设备网站开发注意点
  • 在word上怎么做网站链接网站开发试题
  • 自己做网站新手入门淮北论坛招聘网
  • 建网站的意义大学跳蚤市场网站建设
  • 平阳做网站成都网站优化公司哪家好
  • 庆阳北京网站建设广东省建设工程执业中心网站
  • 佛山哪里有做网站的大学生文创产品设计
  • 电商网站建设运城网站图片链接怎么做的
  • 服务器建网站教程宁波网络营销推广制作
  • 微信公众号属于网站建设网站云解析域名解析
  • 网站的建设及推广在哪找可以做网站的
  • 网站经常修改好不好北京互联网公司50强
  • 知识网站有哪些h5用什么制作
  • 广州网站制作联系方式上海共有多少家企业
  • 自己建一个网站需要什么网站关键词分析工具
  • 建三江建设局网站四川省建设厅官方网站电话
  • 福建志佳建设工程发展有限公司网站vi品牌包装
  • 专业门户网站开发公司龙岩正规全网品牌营销招商
  • 网站怎么做qq微信登陆政务网站的建设时期的概述
  • 购物网站的目的和意义西安做网站xamokj
  • 厦门市建设局网站网站开发周记30篇
  • 工业园区门户网站建设方案塘沽网站开发
  • 郑州网站设计 公司驻马店市可以做网站的公司
  • 推荐盐城网站开发安陆网站开发
  • wordpress中文网站模板软件开发者路线图
  • 福清市建设局网站深圳网站制作品牌祥奔科技
  • 工程建设采购有哪些网站做网络销售怎么样
  • wordpress数据库和网站文件下载商业网站成功的原因