首页 > 编程语言 >Java String加解密踩坑

Java String加解密踩坑

时间:2022-10-30 10:02:35浏览次数:54  
标签:Java String 16 数据源 加解密 解密 密码 password


背景

最近在做一款数据产品,涉及到数据源。既然是数据源,肯定有URL(含port信息),用户名和密码。页面上面,虽然有前端组件mask处理,不能复制出来。但是对于稍微懂点技术的同学,都知道去查看控制台。在我们的产品设计里面,产品同学没有考虑到这种安全机制问题;也就是说,在控制台,可以看到明文密码。

思路

前端只能做mask处理,控制台看到的数据是后端接口返回的,故而需要后端来解决这个问题。

不难想到,后端接口在返回密码等私密信息前,加密处理一下;前端拿到什么数据,就给后端传输什么数据;后续需要使用此密码数据时,后端需要解密一下。即:加密,再解密。

解决

数据源管理菜单的功能大致如下,针对每个数据源可以验证其连通性:

Java String加解密踩坑_数据源


点击连接测试时,报错:

datasource test error
java.lang.Exception: java.lang.Exception: ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 193, host: 10.20.30.40, port: 8123; Code: 193, e.displayText() = DB::Exception: Wrong password for user default (version 19.9.5.36)
at com.xy.cloudiview.common.dataprovider.impl.JdbcDataProvider.check(JdbcDataProvider.java:324)
at com.xy.cloudiview.common.services.DataProviderService.testConnection(DataProviderService.java:98)
at com.xy.cloudiview.web.controller.datasource.DataSourceController.checkDatasource(DataSourceController.java:248)

实在是莫名其妙,木有办法,只能断点调试,返回给前端2个字段:password,encryptedPassword,然后对比一下encryptedPassword解密后的password和最原始的password是否相同。

好家伙,截图来了:

Java String加解密踩坑_安全_02


我们看到断点调试得到的密码都是​​root​​​;但,使用​​String.equals()​​对比发现两者不相等。简单来说,就是如下的截图:

Java String加解密踩坑_安全_03


使用​​String.contentEquals()​​对比,发现两者依旧不相等。

Java String加解密踩坑_数据源_04


测试代码如下:

public static void main(String[] args) {
String s1 = "root";
String s2 = DecodeUtil.encrypt(s1);
String s3 = DecodeUtil.desEncrypt(s2);
System.out.println("s2: " + s2 + "\ns3: " + s3 + "\ns1 == s3 ?: " + s1.equals(s3));
}

见了鬼了。

如果足够仔细的话,会发现第二个截图里面,左边的加密后再解密的密码的长度是16,即:​​char[16]​​​;右边的原始密码的长度是4,即:​​char[4]​​。

验证如下:

Java String加解密踩坑_数据源_05


实际上只需要占用4位,​​trim()​​一下呢?

Java String加解密踩坑_java_06


再对比一下:

Java String加解密踩坑_数据源_07


解决问题。

后续

在我们的业务场景中,数据源是可以查询,新增,编辑,复制,删除的。如果是新增一个数据源,此时用户输入的密码就是明文密码。

此时如果也去解密,做连通性测试的话,肯定会出问题的,事实上,报错如下:​​desEncrypt failed: Input length not multiple of 16 bytes​​​。此处的​​16 bytes​​​,正好也是上面说的:​​char[16]​​。

解决方法

  1. 前端增加一个标志字段:
const [modalType, setModalType] = useState<'update' | 'add' | 'copy' | 'select'>('add');

const testClick = () => {
formModal.validateFields().then((values: any) => {
const {config, sourceName, sourceType} = values;
setTestLoading(true)
test({
name: sourceName,
type: sourceType,
// 新增入参
modalType,
config,
}).then((res: any) => {
message[res.status](`${res.msg}`, 1)
setTestLoading(false)
}).catch(() => {
setTestLoading(false)
})
});
};
  1. 后端判断一下:
// 新增数据源时无需解密
if (!dataSource.getString("modalType").equals("add")) {
// 解密一定要trim()
config.put("password", DecodeUtil.desEncrypt(config.getString("password")).trim());
}


标签:Java,String,16,数据源,加解密,解密,密码,password
From: https://blog.51cto.com/u_15851118/5807203

相关文章

  • Javaweb基础复习------Filter相关应用+登录验证案例的使用
    Filter(过滤器)基本步骤:1、定义类,实现Filter接口,并重写其所有方法2、配置Filter拦截资源的路径,在类上定义2WebFilter注解(WebFilter配置的路径,是拦截资源的路径)3、在d......
  • Java多线程(6):锁与AQS(中)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ Java中的AQS(AbstractQueuedSynchronizer,抽象队列同步器)是用来实现锁及其他同步功能组件的Java底层技术基础,java.util.co......
  • Java数组之合并方法(世界上最简单的方法)
    转自:http://www.java265.com/JavaJingYan/202204/16510261483156.html数组是日常开发中常用的容器,日常开发中,我们通常会定义多个数组,那么有时需要进行两个数组的合并操......
  • how to debug in java
    jdbnormalusages1.compileperiodjavac-g,addcomplieinformationmikeli@dell-pc:~/code/algo_java$javac-gDemToBin3.java  2.debugclassinonewindow......
  • Java Web
    javaweb是指,所有通过java语言编写可以通过浏览器访问的程序的总称,叫javaweb。javaweb是基于请求和影响来开发的。请求是指客户端给服务器发送的数,请求叫Request。......
  • Java安全之Tomcat6 Filter内存马
    Java安全之Tomcat6Filter内存马回顾Tomcat8打法先回顾下之前Tomcat789的打法这里先抛开78之间的区别,在8中,最后add到filterchain的都是一个filterconfig对象Applica......
  • C++11 unistring 类(编码转换)
    C++11 的编码转换程序: #ifndefUNISTRING_HPP#defineUNISTRING_HPP#include<algorithm>#include<codecvt>#include<cstdio>#include<cstdarg>#include<i......
  • JavaScript – event loop 事件循环, 单线程, Web Worker
    前言因为要写RxJS系列,有一篇要介绍scheduler.它需要基础的JS执行机制,于是就有了这里篇. 顺带也介绍以下WebWorker呗. 参考知乎–详解JavaScript中的......
  • netty高性能编程-第2章Java BIO编程
    2.1IO模型I/O模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能Java共支持3种网络编程模型/IO模式:BIO、NIO、AIOJavaBIO:同步......
  • java 二维数组
    publicclassArrayTwo{publicstaticvoidmain(String[]args){int[][]arr={{1,2,3},{11,223,44}};......