ClassFinal对项目进行加密处理

老板要求内部算法模型加密,找了XJAR方法和proguard方法,XJAR很傻瓜,我调用不了里面的API,proguard软件需要配置的东西太多,也没有清晰的教程,因此选择了ClassFinal方法。

此种方法相比于proguard,采用maven仓库导入相应的依赖,再打包便可生成加密的jar包

目录

1.进行pom.xml配置,导入相应的依赖

2.配置完pom.xml后,便可打包生成加密文件

3.配置javaagent

4.测试项目能否成功运行 

1.进行pom.xml配置,导入相应的依赖

pom.xml的配置

   <plugin>
                <!-- https://gitee.com/roseboy/classfinal -->
                <groupId>net.roseboy</groupId>
                <artifactId>classfinal-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
<!--                    无密码模式-->
                    <password>#</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
                    <packages>com.itheima</packages>
                    <cfgfiles>application.properties</cfgfiles>
                    <excludes>org.spring</excludes>
                    <libjars></libjars>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>classFinal</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

参数说明,其中重要的是password和packges,密码最好不要设置,我反正是不断报错,直接设成无密码格式,包名层级用.号隔开,跟springmvc扫描包的感觉差不多。这样子就可以把包下的文件全部进行加密,成如下的形式。

加密前

加密后

  

直接隐藏方法内容,非常给力  

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

2.配置完pom.xml后,便可打包生成加密文件

加密文件如下形式

3.配置javaagent

完成后,打开jar包所在目录,输入cmd,打开命令行窗口,输入以下命令(注意将文件名改成自己加密文件的文件名)

java -javaagent:yourproject-encrypted.jar='-pwd 123' -jar yourproject-encrypted.jar

我输入的命令行(无密码模式)

java -javaagent:springboot_01_01_quickstart-0.0.1-SNAPSHOT-encrypted.jar -jar springboot_01_01_quickstart-0.0.1-SNAPSHOT-encrypted.jar

 因为我设置的是无密码模式,程序直接跳转运行


项目成功运行,也成功加密,非常给力。我用的是JDK11版本,所支持的版本也非常高,proguard才支持JDK1.8,非常不行 

 参考:ClassFinal 对 java 代码进行混淆和加密_清泉影月的博客-CSDN博客_classfinal

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
1. 创建一个Controller类来处理登录请求和验证: ```java @Controller @RequestMapping("/admin") public class AdminController { @Autowired private AdminService adminService; @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(HttpServletRequest request, Model model) { String username = request.getParameter("username"); String password = request.getParameter("password"); Admin admin = adminService.getAdminByUsername(username); if(admin == null) { model.addAttribute("error", "用户名不存在"); return "admin/login"; } String decryptPassword = RSAUtils.decrypt(password, admin.getPrivateKey()); if(!decryptPassword.equals(admin.getPassword())) { model.addAttribute("error", "密码错误"); return "admin/login"; } request.getSession().setAttribute("admin", admin); return "redirect:/admin/index"; } } ``` 2. 创建一个Service类来处理业务逻辑: ```java @Service public class AdminService { @Autowired private AdminMapper adminMapper; public Admin getAdminByUsername(String username) { return adminMapper.getAdminByUsername(username); } } ``` 3. 创建一个Mapper类来实现数据库操作: ```java public interface AdminMapper { @Select("SELECT * FROM admin WHERE username = #{username}") @Results({ @Result(property = "privateKey", column = "private_key"), @Result(property = "createTime", column = "create_time") }) Admin getAdminByUsername(String username); } ``` 4. 创建一个工具类来实现RSA加密和解密: ```java public class RSAUtils { private static final String CHARSET = "UTF-8"; private static final String RSA_ALGORITHM = "RSA"; public static String decrypt(String encryptedData, String privateKey) { try { byte[] data = Base64.decodeBase64(encryptedData); byte[] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateK); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; while (inputLen - offSet > 0) { if (inputLen - offSet > 128) { cache = cipher.doFinal(data, offSet, 128); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 128; } byte[] decryptedData = out.toByteArray(); out.close(); return new String(decryptedData, CHARSET); } catch (Exception e) { throw new RuntimeException("解密失败", e); } } } ``` 5. 在前端页面中使用RSA加密密码并提交表单: ```html <form method="post" action="${pageContext.request.contextPath}/admin/login"> <div class="form-group"> <label for="username">用户名</label> <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名"> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" class="form-control" id="password" name="password" placeholder="请输入密码"> </div> <button type="submit" class="btn btn-primary">登录</button> </form> <script src="${pageContext.request.contextPath}/static/js/jsencrypt.min.js"></script> <script> var encrypt = new JSEncrypt(); encrypt.setPublicKey("-----BEGIN PUBLIC KEY-----\n" + "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDm1pmZC9JcLH1geQvYzK0b8Z0P\n" + "4v4zWtj8X9O9JL5pCvKDrWojJ8QI5c5q3q5K5z5MzGKU6iXD3lNJYU6VWU1LJz1K\n" + "z7VWmZ8n9PbTowKj/1rFzrLHaA1xVjKwH2s7NzgPZ0XbJyTjKvJg7yWHT+JG0xKj\n" + "okZuFXzjXV6UJq6G+QIDAQAB\n" + "-----END PUBLIC KEY-----"); $("#password").on("input propertychange", function() { var password = $(this).val(); var encryptedPassword = encrypt.encrypt(password); $(this).val(encryptedPassword); }); </script> ``` 注意:在使用RSA加密和解密的过程中,需要使用相同的密钥对。在这里,我们使用JSEncrypt生成公钥,并将其传递给前端。后端的私钥保存在数据库中,用于解密密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值