首页 > 其他分享 >[spring security]错误使用spring security内置加密工具BCryptPasswordEncoder引发的性能问题

[spring security]错误使用spring security内置加密工具BCryptPasswordEncoder引发的性能问题

时间:2023-02-03 17:22:05浏览次数:60  
标签:加密 BCryptPasswordEncoder spring 性能 接口 security BCrypt CPU

参考博文

实战代码(十):Springboot RestTemplate连接池
记一次使用BCryptPasswordEncoder,设置了不合理参数导致耗时严重的坑
高安全加密BCrypt及其性能缺陷

背景

项目上线前测试人员对接口进行性能测试时, 发现某个接口TPS仅在27-30左右浮动, CPU占用率接近100%,以下是部分代码

// 通过redis获取当前登录者用户信息
UserInfo u = redisCache.getUserInfo(currentUserId);
// 更新用户信息
u.setProvince(province);
u.setCity(city);
u.setDistrict(district);
u.setPassword(BCryptPasswordEncoder.encode(password));
userMapper.updateById(u);
// 调用第三方接口
HttpUtil.post(url, param);
// 清除用户缓存
 redisCache.clearUserInfo(currentUserId);

分析排查

业务逻辑很简单,由于该接口调用了第三方接口,所以第一反应是围绕这里做优化

上述代码里所用的HttpUtil是hutool工具下的, 查看源码

可以看到每次建立连接时都是断开上次的连接再重新连接, 这里会有一定的NETWORK IO消耗, 先改这里

方案是使用RestTemplate+HttpClient实现连接池, 减少连接的IO消耗

改完后发现TPS依然在27左右, CPU占用率依然接近100%, 随后将调用第三方接口的代码注释掉, 问题依旧.说明问题并不在调用第三方接口 (其实复盘后总结CPU利用率高单NetWorkIO并不高也就可以排除这里)

于是再排查, 注意到每次调用这个接口都要使用Spring Security内置的BCrypt对密码进行加密再存储到数据库, 会不会是这里有性能消耗?

查阅资料后发现确实如此: "BCrypt比传统hash+salt要安全一万倍,但是代价是使用BCrypt做认证对比密码和密文时候,性能也比hash+salt要慢一万倍。"

初步定位到问题点是加密导致的性能损耗!!

解决

设置BCrypt加密时的参数strength, 在保证安全性的前提下提高性能

strength的取值范围是4-31

new BCryptPasswordEncoder(4).encode(passWord);

修改后,TPS提升10倍,维持在270左右, CPU利用率也保持在70%左右

标签:加密,BCryptPasswordEncoder,spring,性能,接口,security,BCrypt,CPU
From: https://www.cnblogs.com/javanoob0660/p/17089785.html

相关文章

  • SpringBoot配置属性之Server
    server配置server.address指定server绑定的地址  server.address= 0.0.0.0 #springboot部署服务器端微服务,server.address配置0.0.0.0,否则当微服务的jar......
  • 多线程事务回滚sqlSession, spring-mybatis 开启事务
    @ResourceSqlContextsqlContext;/***多线程事务.*@paramemployeeDOList*/@OverridepublicvoidsaveThread(List<EmployeeDO>employeeDOList)throwsSQL......
  • Spring注解开发
    Spring原始注解Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。Spring原始注解主要是替代......
  • springboot整合thymeleaf
    springboot的打包方式默认是jar包的形式,jsp无法在压缩包的形势下进行编译所以springboot引入了一些其他的模板引擎比如thymeleaf表达方式语法用途变量取值${.........
  • 狂神说Springboot笔记
    狂神说SpringBoot视频链接:B站教学视频SpringBoot系列笔记:狂神说SpringBoot01:Hello,World!狂神说SpringBoot02:运行原理初探狂神说SpringBoot03:yaml配置注入狂神......
  • Springboot websocket 的简单使用
    项目结构:引入依赖:"org.springframework.boot:spring-boot-starter-websocket","org.springframework.boot:spring-boot-starter-thymeleaf",启动类:publicclassDem......
  • 【Spring事物三千问】DataSource的设计和常用实现——Hikari、Druid
    javax.sql.DataSourcejavax.sql.DataSource是jdk提供的接口,各个连接池厂商和Spring都对DataSource进行了设计和实现。javax.sql.DataSource是连接到物理数据源的......
  • Linux 配置Tomcat、SpringBoot项目开机自启
    Linux配置Tomcat、SpringBoot项目开机自启#javaenvironment指定java环境exportJAVA_HOME=/home/jdk1.8.0_11exportCLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAV......
  • springcloud:gateway聚合swagger 下篇(十二)
    0.引言上一章我们之前讲解了在​​单个服务中部署swagger​​,但每次都需要在不同的端口中访问不同服务的swagger-ui。那么本期我们就来讲解一下,如何从一个统一的入口访问不......
  • springcloud:接口文档自动生成器swagger详解 上篇(十一)
    0.引言在微服务的开发工作中,前后端的协同开发是必不可少的,随着服务数与接口数的增加,手写接口文档成为了一个苦活累活,很多程序员对此也很抵触。同时我们也需要有一个地方来......