头像

jar 混淆加密,classfinal加密

混淆工具

jar包混淆工具挺多的,实现原理不尽相同,这里使用的classfinal,

classfinal介绍

ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。Gitee: ClassFinal: Java字节码加密工具

项目模块说明

  • classfinal-core: ClassFinal的核心模块,几乎所有加密的代码都在这里;
  • classfinal-fatjar: ClassFinal打包成独立运行的jar包;
  • classfinal-maven-plugin: ClassFinal加密的maven插件;

功能特性

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
  • 运行加密项目时,无需求修改tomcat,spring等源代码。
  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
  • 支持maven插件,添加插件后在打包过程中自动加密。
  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。
  • 支持绑定机器,项目加密后只能在特定机器运行。
  • 支持加密springboot的配置文件。

环境依赖

JDK 1.8 +

加密

执行以下命令

java -jar classfinal-fatjar.jar -file yourproject.jar -libjars a.jar,b.jar -packages com.yourpackage,com.yourpackage2 -exclude com.yourpackage.Main -pwd 123456 -Y
参数说明
-file 加密的jar/war完整路径
-packages 加密的包名(可为空,多个用","分割)
-libjars jar/war包lib下要加密jar文件名(可为空,多个用","分割)
-cfgfiles 需要加密的配置文件,一般是classes目录下的yml或properties文件(可为空,多个用","分割)
-exclude 排除的类名(可为空,多个用","分割)
-classpath 外部依赖的jar目录,例如/tomcat/lib(可为空,多个用","分割)
-pwd 加密密码,如果是#号,则使用无密码模式加密
-code 机器码,在绑定的机器生成,加密后只可在此机器上运行
-Y 无需确认,不加此参数会提示确认以上信息

结果: 生成 yourpaoject-encrypted.jar,这个就是加密后的jar文件;加密后的文件不可直接执行,需要配置javaagent。

注: 以上示例是直接用参数执行,也可以直接执行 java -jar classfinal-fatjar.jar按照步骤提示输入信息完成加密。

maven插件方式

在要加密的项目pom.xml中加入以下插件配置,目前最新版本是:1.2.1。

<plugin> <!-- https://gitee.com/roseboy/classfinal -->
<groupId>net.roseboy</groupId>
<artifactId>classfinal-maven-plugin</artifactId>
<version>${classfinal.version}</version>
<configuration> <password>000000</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
<packages>com.yourpackage,com.yourpackage2</packages>
<cfgfiles>application.yml</cfgfiles>
<excludes>org.spring</excludes>
<libjars>a.jar,b.jar</libjars>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>classFinal</goal> </goals>
</execution>
</executions>
</plugin>

运行mvn package时会在target下自动加密生成yourpaoject-encrypted.jar。

maven插件的参数名称与直接运行的参数相同,请参考上节的参数说明。

无密码模式

加密时-pwd参数设为#,启动时可不用输入密码; 如果是war包,启动时指定参数 -nopwd,跳过输密码过程。

机器绑定

机器绑定只允许加密的项目在特定的机器上运行;

在需要绑定的机器上执行以下命令,生成机器码

java -jar classfinal-fatjar.jar -C

加密时用-code指定机器码。机器绑定可同时支持机器码+密码的方式加密。

启动加密后的jar

加密后的项目需要设置javaagent来启动,项目在启动过程中解密class,完全内存解密,不留下任何解密后的文件。

解密功能已经自动加入到 yourpaoject-encrypted.jar中,所以启动时-javaagent与-jar相同,不需要额外的jar包。

启动jar项目执行以下命令:

java -javaagent:yourproject-encrypted.jar='-pwd 0000000' -jar yourproject-encrypted.jar //参数说明 // -pwd 加密项目的密码 // -pwdname 环境变量中密码的名字

或者不加pwd参数直接启动,启动后在控制台里输入密码,推荐使用这种方式:

java -javaagent:yourpaoject-encrypted.jar -jar yourproject-encrypted.jar

密码读取顺序已经改为:参数获取密码||环境变量获取密码||密码文件获取密码||控制台输入密码||GUI输入密码||退出

tomcat下运行加密后的war

将加密后的war放在tomcat/webapps下, tomcat/bin/catalina 增加以下配置:

//linux下
catalina.sh CATALINA_OPTS="$CATALINA_OPTS -javaagent:classfinal-fatjar.jar='-pwd 0000000'";
export CATALINA_OPTS;
//win下
catalina.bat set JAVA_OPTS="-javaagent:classfinal-fatjar.jar='-pwd 000000'" //参数说明 // -pwd 加密项目的密码 // -nopwd 无密码加密时启动加上此参数,跳过输密码过程 // -pwdname 环境变量中密码的名字
注意事项

本工具使用AES算法加密class文件,密码是保证不被破解的关键,请保存好密码,请勿泄漏。

密码一旦忘记,项目不可启动且无法恢复,请牢记密码。

本工具加密后,原始的class文件并不会完全被加密,只是方法体被清空,保留方法参数、注解等信息,这是为了兼容spring,swagger等扫描注解的框架; 方法体被清空后,反编译者只能看到方法名和注解,看不到方法的具体内容;当class被classloader加载时,真正的方法体会被解密注入。

为了保证项目在运行时的安全,启动jvm时请加参数: -XX:+DisableAttachMechanism 。

亲测可用!!!

本文转自:https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?product=smartapp&tk=7a5b9d7f4b738f6316f37e271bfff060&share_url=https%3A%2F%2Fyebd1h.smartapps.cn%2Fpages%2Fblog%2Findex%3FblogId%3D123468490%26_swebfr%3D1%26_swebFromHost%3Dbaiduboxapp&domain=mbd.baidu.com

头像

Java代码混淆工具Allatori混淆jar可执行包的使用方法

Allatori简介

Allatori 是第二代 Java 混淆器,可为您的知识产权提供全方位的保护。
Allatori 不只是混淆,它还最小化应用程序大小,并提高速度,同时除了您和您的团队之外,任何人都无法读取您的代码。与每个现代 Java 混淆器一样,Allatori 具有完整的水印功能,可以为您的软件提供适当的许可!
如果您有必要保护您的软件,并且想要减小其大小和处理时间,那么 Allatori 混淆器非常适合您。

Allatori配置

  • 1.首先新建一个allatori文件夹
  • 2.下载后,解压,找到allatori.jar文件并复制到allatori文件夹中
  • 3.在解压的Allatori-8.4-Demo\tutorial\step01\files目录下,把Clean.bat、config.xml、RunAllatori.bat都复制到allatori文件夹中
  • 4.把需要混淆代码的jar包复制到allatori文件夹中,比如我的是:main.jar
  • 5.修改clean.bat代码为
    del log.xml
    del obf-main.jar
  • 6.修改RunAllatori.bat代码为
    java -Xms128m -Xmx512m -jar allatori.jar config.xml
    pause
  • 7.修改config.xml代码为
    <config>
    <input>
    <jar in=”main.jar” out=”obf-main.jar”/>
    </input>

    <keep-names>
    <class access=”protected+”>
    <field access=”protected+”/>
    <method access=”protected+”/>
    </class>
    </keep-names>

    <ignore-classes>
    <!–不混淆 引入的第三方jar包–>
    <class template=”class *org*”/>
    <class template=”class *com*”/>
    <class template=”class *lib*”/>
    </ignore-classes>

    <classpath>
    <!– 将lib目录下的所有jar加入classpath –>
    <jar name=”lib/*.jar”/>
    </classpath>

    <property name=”log-file” value=”log.xml”/>
    </config>

  • 8.在allatori文件夹下新建lib文件夹,把jdk文件夹下的jre和lib里面的所有jar包复制到该lib文件夹下。

Allatori混淆

  • 1.双击运行RunAllatori.bat文件,开始混淆main.jar代码
  • 2.混淆完后,查看obf-main.jar 为混淆后的jar包文件

Allatori混淆其他方法

Allatori解压包下面有step01-step07,7中混淆方法,可以把里面的config.xml复制出来,自行修改。

最后大家有任何问题,欢迎留言,一起讨论。

头像

最全 Java 面试笔试题汇总

在最近的面试准备中,发现网上很多 Java 面试题非常零散,没有归纳总结,所以花了很长时间搜集整理出来了这套 Java 面试题大全,希望对大家有帮助哈~

java 基础

集合

HashMap 和 ConcurrentHashMap 的实现原理是怎样的?ConcurrentHashMap 是如何保证线程安全的?

简述 ArrayList 和 LinkedList 的底层实现以及常见操作的时间复杂度

hashmap 和 hashtable 的区别是什么?

HashMap 实现原理,为什么使用红黑树?

HashMap 中的“死锁”是怎么回事?

HashMap 中能 put 两个相同的 key 吗?为什么?

HashMap 中的键值可以为 Null 吗?原理是什么?

HashMap 扩容机制?

hashmap1.7/1.8 实现区别

集合类中的 List 和 Map 的线程安全版本是什么,如何保证线程安全的?

HashMap 的数据结构是什么?如何实现的。和 HashTable,ConcurrentHashMap 的区别

ArrayList 是如何实现的,ArrayList 和 LinedList 的区别?ArrayList 如何实现扩容

简述 BIO、NIO、AIO 的区别

IO 和 NIO 的区别,NIO 优点

其他

hashcode 和 equals 方法的联系

什么是重写和重载?

简述 java 中 final 关键字的作用

简述 java 的反射机制

java 如何高效进行数组拷贝?

成员变量和方法的区别?

java 中接口和抽象类的区别

简述一致性哈希算法的实现及原理

String 类能不能被继承?为什么?

hashcode 和 equals 方法的联系

==和 equals()的区别?

equals 方法实现

面向对象

java web

Cookie 和 Session 的关系和区别是什么?

HTTP 连接池实现原理

JVM

java 中垃圾回收机制中如何判断对象需要回收?常见的 GC 回收算法有哪些?

java 如何防止内存溢出?

java 类的加载流程是怎样的?什么是双亲委派机制?

简述 JVM 内存模型,JVM 内存是如何对应操作系统内存的?

JVM 内存模型是怎样的,简述新生代和老年代的区别

CAS 实现原理是什么?

JVM 是怎么去调优的?简述过程和调优结果

简述 java 的 happer before 原则

JVM 如何加载字节码文件

类加载器如何卸载字节码

有没有看过 JDK 源码,看过的类实现原理是什么

JVM 如何加载字节码文件

JVM GC,GC 算法。

什么情况会出现 Full GC,什么情况会出现 yong GC。

JVM 内存模型

Java 运行时数据区

并发&多线程

java 中的线程有哪些状态,转换关系是怎样的?

synchroinzed 关键字底层是如何实现的?它与 Lock 相比优缺点分别是什么?

volatile 关键字解决了什么问题,它的实现原理是什么?

什么情况下会发生死锁,如何解决死锁?

ThreadLocal 的实现原理是什么?

并发事务会引发哪些问题?如何解决?

java 线程间有多少种通信方式?

简述 synchroinzed、volatile、可重入锁的不同使用场景及优缺点

java 中常见锁有哪些?ReetrantLock 是怎样实现的?

简述生产者消费者模型

手写生产者消费者模型

java 是如何实现线程安全的

java 中的 sleep()和 wait()的区别

java 线程池里的 arrayblockingqueue 与 linkeblockingqueue 的使用场景和区别

Netty 是如何使用线程池的,为什么这么使用

Java 线程池的实现原理,keepAliveTime 等参数的作用

Java 线程的状态

进程和线程的区别,进程间如何通讯,线程间如何通讯

线程状态,BLOCKED 和 WAITING 有什么区别

设计模式

简述常见的工厂模式以及单例模式的使用场景

简述装饰者模式以及适配器模式

实现单例设计模式(懒汉、饿汉)

介绍设计模式,如模板模式,命令模式,策略模式,适配器模式、桥接模式、装饰模式,观察者模式,状态模式,访问者模式

数据库

简述乐观锁以及悲观锁的区别以及使用场景

简述 mysql 常见索引数据,介绍一下覆盖索引

简述事务的四大特性

mysql 为什么用 B+ 树来做索引,对比 B 树它的优点和缺点是什么?

简述脏读和幻读的发生场景,innodb 是如何解决幻读的?

数据库的事务的隔离级别有哪些?各有哪些优缺点?

聚簇索引和非聚簇索引有什么区别?什么情况用聚集索引?

什么是数据库事务,MySQL 为什么会使用 innoDB 作为默认选项?

Mysql 有哪些常见的存储引擎?

数据库有哪些常见索引?数据库设计的范式是什么?

简述数据库中的 ACID 分别是什么?

MySQL 中 Join 和 left join 的区别是什么?

简述 MySQL 三种日志的使用场景

模糊匹配查询是如何实现的?

SQL 优化的方案有哪些,如何定位问题并解决问题?

简述数据库什么情况下进行分库,什么情况下进行分表?

数据库索引的实现原理是什么?

简述什么是最左匹配原则?

数据库的读写分离的作用是什么?如何实现?

唯一索引与普通索引的区别是什么?使用索引会有哪些优缺点?

MySQL 的索引什么情况下会失效?

简述 MySQL 的主从同步机制,如果同步失败会怎么样?

假设建立联合索引(a,b,c),如果对字段 a 和 c 查询,会用到这个联合索引吗?

数据库连接池实现原理

数据库的实现原理

事务的实现原理

索引有什么用?如何建索引?

Redis

redis 如何实现分布式锁?

简述 Redis 的线程模型及底层架构设计

简述 Redis 持久化中的 rdb 以及 aof 方案的优缺点

为什么 Redis 在单线程下能如此的快?

简述 Redis 的过期机制和内存淘汰策略

简述 Redis 哨兵机制

简述 Redis 如何处理热点 key 访问

简述 Redis 中常见类型的底层数据结构

Redis 序列化有哪些方式?

简述 Redis 中如何防止缓存雪崩和缓存击穿

Redis 有几种数据结构?Zset 是如何实现的?

Redis 中 key 的过期策略有哪些?

简述 Redis 跳表的应用以及优缺点

Redis 中 sentinel 和 cluster 的区别和适用场景是什么?

Redis 如何实现延时队列,分布式锁的实现原理

假设 Redis 中的 master 节点宕机了,你会怎么进行数据恢复?

为什么要用 Redis,Redis 有哪些优缺点?Redis 如何实现扩容?

Redis 缓存和数据库数据一致性

Mq

kafka 发送消息是如何保证可靠性的?

消息中间件是如何实现的,技术难点有哪些

Spring

简述 Spring 的初始化流程

简述 SpringAOP 原理

SpringMVC 的原理和流程

spring 循环依赖,为什么要用三级缓存,二级缓存行不行

为什么要使用 Spring,Spring 的优缺点有哪些

Spring 的 IOC 容器初始化流程

Spring 的 IOC 容器实现原理,为什么可以通过 byName 和 ByType 找到 Bean

Spring AOP 实现原理

spring 中 bean 的生命周期

spring 创建 bean 的流程

什么是 spring 的循环依赖问题

spring 循环依赖问题如何解决

为什么 spring 使用三级缓存解决循环依赖问题

spring 循环依赖源码解析

修改 spring 源码尝试二级缓存是否解决循环依赖问题

Spring boot

springboot 是如何进行自动配置的

分布式

分布式事务,两阶段提交。

如何实现分布式锁

如何实现分布式 Session

如何保证消息的一致性

负载均衡

正向代理(客户端代理)和反向代理(服务器端代理)

CDN 实现原理

怎么提升系统的 QPS 和吞吐量

系统设计

电商系统中,如何实现秒杀功能?如何解决商品超卖问题?

简述 CAP 理论

什么是最终一致性?

什么是幂等操作?

简述生产者消费者模式的流程

设计一个阻塞队列

简述 MapReduce 的原理

停车场有有限个车位,有多个车来抢车位,设计一个系统需要根据车辆进入和离开停车场的时间进行计费

假如明天是活动高峰?QPS 预计会翻 10 倍,你要怎么做?

如何搭建一个高可用系统

哪些设计模式可以增加系统的可扩展性

抽象能力,怎么提高研发效率。

什么是高内聚低耦合,请举例子如何实现

什么情况用接口,什么情况用消息

如果 AB 两个系统互相依赖,如何解除依赖

如何写一篇设计文档,目录是什么

什么场景应该拆分系统,什么场景应该合并系统

系统和模块的区别,分别在什么场景下使用

实战

有没有处理过线上问题?出现内存泄露,CPU 利用率标高,应用无响应时如何处理的

开发中有没有遇到什么技术问题?如何解决的

如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能。

新浪微博是如何实现把微博推给订阅者

Google 是如何在一秒内把搜索结果返回给用户的。

12306 网站的订票系统如何实现,如何保证不会票不被超卖。

如何实现一个秒杀系统,保证只有几位用户能买到某件商品

看过哪些开源框架的源码

网络

HTTP 协议

TCP 协议

非技术

项目中最难的地方是哪里?你学到了什么?

对加班有什么看法?

你的优势和劣势是什么?

与同事沟通的时候,如果遇到冲突了如何解决?

最近一年内遇到的最有挑战的事情是什么?

如何学习一项新技术,比如如何学习 Java 的,重点学习什么

有关注哪些新的技术

工作任务非常多非常杂时如何处理

项目出现延迟如何处理

和同事的设计思路不一样怎么处理

如何保证开发质量

职业规划是什么?短期,长期目标是什么

团队的规划是什么

能介绍下从工作到现在自己的成长在那里

作者:GilesLv
链接:https://ld246.com/article/1609340934105
来源:链滴
协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

头像

java实现替换json字符串参数值

以下是代码:

String str="{\"code\":\"na7ne\",\"identity\":1671760031645,\"password\":\"88888888\",\"username\":\"fuj\"}";
JSONObject jsonObject = JSON.parseObject(str);
System.out.println(str);
for(Map.Entry<String,Object> map: jsonObject.entrySet()){
    if(map.getKey().contains("password"))
        JSONPath.set(jsonObject,"$."+map.getKey(),"***");
}
System.out.println(jsonObject.toJSONString());

以下是输出内容:

{"code":"na7ne","identity":1671760031645,"password":"88888888","username":"fuj"}
{"password":"***","code":"na7ne","identity":1671760031645,"username":"fuj"}
头像

MYBATIS-PLUS 多数据源-读写分离

前言

最近翻了下mybatis-plus官方文档,发现多数据源这一块,提供了读写分离的功能。之前系统使用的sharding sphere插件实现读写分离(没有使用分库分表,业务上不去),总结有以下缺陷:
1、单纯使用读写分离,也受到SQL不支持项的约束
2、项目启动时,加载meta数据时间比较长(200+的表,本地开发加载12000+ms,测试环境4000+ms)
3、打印的sql执行日志,换行比较多,也不像mybatis打印的SQL那么容易还原(或者直接通过插件还原)
既然mybatis-plus提供了读写分离功能,系统中本来也集成了mybatis-plus,于是决定改用mybatis-plus提供读写分离。

PS:自己也找过很多方式尝试,失败了!!!

过程

官网地址

mbatis-plus
mybatis-plus 多数据源

过程

按照官网指引

引入DYNAMIC-DATASOURCE-SPRING-BOOT-STARTER

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>

配置数据源,使用HIKARI连接池

spring:
  datasource:    
    dynamic:
      p6spy: false
      hikari:
        connection-test-query: SELECT 1
        minimum-idle: 60
        idle-timeout: 30000
        maximum-pool-size: 500
        auto-commit: true
        max-lifetime: 120000
        connection-timeout: 30000
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://xxx:3306/xxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            pool-name: masterHikariPool
        slave_1:
          url: jdbc:mysql://xxxx:3308/xxxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            pool-name: slave1HikariPool

注意,在官网的示例里,默认是使用druid连接池,要修改为hikari,必须指定type:com.zaxxer.hikari.HikariDataSource,不然都是使用druid,而且该starter使用的druid版本,还是会有localDateTime转换出错的问题

使用读写分离模式

    @Bean
    public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){
        return new MasterSlaveAutoRoutingPlugin();
    }

开启日志打印

logging:
  level:
  	com.baomidou.dynamic: debug

注意,这个是全局配置,可以不用@DS注解在每个类上,当然也可以注解,注解了@DS,则按照@DS注解进行

网址来源:https://www.freesion.com/article/65781031315/

如果存在不生效的问题,可以修改启用类的注解,如:@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)


头像

win10修改ip,出现了一个意外的情况。不能完成所有你在设置中所要求的更改。

今天在调试硬件设计,需要修改网段信息。在修改的时候弹出以下窗口,提示修改失败。

微信截图_20220531175114

 

可以通过cmd 方式修改,执行 netsh interface ip set address “以太网” static 192.168.1.194 255.255.255.0

如果要修改为自动获取ip,执行:netsh interface ip set address “以太网” source=dhcp

头像

[postgresql] – 重复数据删除,仅保留其中一条

1.常规删除方法
explain analyse delete from deltest a where a.ctid <> (select min(t.ctid) from deltest t where a.id=t.id);
2.group by删除方法
explain analyse delete from deltest a where a.ctid not in (select min(ctid) from deltest group by id);
3.row_number删除方法
explain analyze delete from deltest a where a.ctid = any(array (select ctid from (select row_number() over (partition by id), ctid from deltest) t where t.row_number > 1));

根据某个字段分组删除重复数据,只保留日期最大的一条,建议使用窗口函数效率更高