解决不了问题,就解决提出问题的人

首先,这里说的不是"解决不了问题,就解决提出问题的人"这种字面上的意思,而是工作中处理问题的一种类似的思想。

最近解决 sonar 扫描的问题,客户要求的,不能出现故障严重级别的问题,有一个问题是运营商 API 的密码加密,是 AES 对称加密,且向量字符串是固定字符串(运营商提供的),不是随机字符串,sonar 扫描提示这个固定字符串的向量不安全,让使用随机字符串,但是运营商那边肯定不会给修改,然后这个问题就陷入僵局了,我们加密代码也是从运营商的对接文档上复制下来的。

所以这个问题该怎么解决呢,我一直在纠结怎么能把这个固定字符串改成随机字符串,也就是纠结于怎么解决问题本身,所以结论就是无法解决,除非运营商配合改解密方法,但那是不可能的。

一个同事后来提醒了我,sonar 扫描的是这个new IvParameterSpec()的代码,只要我们把向量传进去,不使用这个代码就行,用 hutool 的另一个构造器,刚好,我试了下,果然 sonar 就不识别这个问题了。下面贴出具体的代码:

修改前的代码:

java 复制代码
private static String getEncodePassWord(String encodeKey, String ivKey, String password) {
    AES aes = new AES(Mode.CBC, Padding.ZeroPadding, new SecretKeySpec(encodeKey.getBytes(), "AES"), new IvParameterSpec(ivKey.getBytes()));
    return aes.encryptBase64(password, StandardCharsets.UTF_8);
}

这里用的其实是 hutool 里面的 AES 类。修改目标是代码中不出现new IvParameterSpec(ivKey.getBytes())

修改前用的构造方法1 ,修改后用的构造方法2

截图中的两个构造方法:

java 复制代码
public AES(Mode mode, Padding padding, SecretKey key, byte[] iv) {
    this((Mode)mode, (Padding)padding, (SecretKey)key, (AlgorithmParameterSpec)(ArrayUtil.isEmpty(iv) ? null : new IvParameterSpec(iv)));
}

public AES(Mode mode, Padding padding, SecretKey key, AlgorithmParameterSpec paramsSpec) {
    this(mode.name(), padding.name(), key, paramsSpec);
}

修改后的代码:

java 复制代码
private static String getEncodePassWord(String encodeKey, String ivKey, String password) {
    AES aes = new AES(Mode.CBC, Padding.ZeroPadding, new SecretKeySpec(encodeKey.getBytes(), "AES"), ivKey.getBytes());
    return aes.encryptBase64(password, StandardCharsets.UTF_8);
}

这就是没有解决 AES 加密使用固定字符串的向量不安全的问题,但是解决了提出这个问题的sonarQube

还有就是静态变量赋值的问题,这个问题说的是静态变量不应在实例方法中进行赋值,我们可以中间加一个静态方法,实例方法调用该静态方法来给静态变量赋值,也是类似的思路,sonar 就不会报错了。

java 复制代码
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextUtil implements ApplicationContextAware {

    @Getter
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
        set(applicationContext);
    }

    /**
     * 【sonar问题解决】Instance methods should not write to "static" fields
     */
    private static void set(ApplicationContext applicationContext) {
        ApplicationContextUtil.applicationContext = applicationContext;
    }
}
相关推荐
2601_962055977 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿8 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_21696290969 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理10 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒10 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构11 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构11 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构12 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常13 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端
LinMINGJing00713 小时前
PageHeaderData:Page 的页面头
后端