欢迎访问我的个人网站==》 jiashubing.cn

Java的class与String互相转换,自定义密码策略

目的

客户要求密码校验方式,用自己的认证方式。提供一种方案,在不出补丁的情况下,解决这个问题。

原理

1、本地写一个类,用客户想要的方案,实现密码校验的接口,编译成class类。
2、然后把这个class类,先转换成二进制,再转换成16进制的字符串。
3、将字符串写到客户的数据库里。
4、重启服务,在类加载的时候,把数据库里的字符串再转换成二进制,再转换成class类。

核心逻辑

package remote;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author jiash
 * @since 2022/3/25
 */
public class AAA {
    public static void main(String[] args) throws Exception {
        // 将写好的类编译成class
        String path = "E:\\test\\custom_pass\\CustomRestUrlChecker3.class";
        FileInputStream fi = new FileInputStream(path);

        // class 转换成二进制,再转换成 String
        int length = readClassLength(path);
        byte[] data = InputStreamToByte(fi);
        String ans = bytesToHex(data);
        System.out.println(ans);

        // String 转换成class
        str2Class(ans, length);
    }

    public static int readClassLength(String path) throws IOException {
        // 模拟远程读取class的文件内容 开始
        byte[] data = new byte[1024 * 1024 * 2];
        FileInputStream fi = new FileInputStream(path);
        int length = fi.read(data);
        fi.close();
        System.out.println(length);
        return length;
    }

    public static void str2Class(String ans, int length) {
        byte[] data = hexTobytes(ans);
        // 加载
        Class<?> obj = new RemoteClassLoad().load(data, length);
        // 使用
        try {
            Object jarTestInstance = obj.newInstance();
            TestInterface xx = (TestInterface) jarTestInstance;
            // TestInterface xx = obj.cast(TestInterface.class).;
            System.out.println(xx.f());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static byte[] InputStreamToByte(InputStream iStrm) throws IOException {
        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
        int ch;
        while ((ch = iStrm.read()) != -1) {
            bytestream.write(ch);
        }
        byte[] imgdata = bytestream.toByteArray();
        bytestream.close();
        return imgdata;
    }

    /**
     * byte[]转Hex
     */
    public static String bytesToHex(byte[] b) {
        StringBuilder sb = new StringBuilder();
        for (byte value : b) {
            String hex = Integer.toHexString(value & 0xFF);
            if (hex.length() < 2) {
                hex = "0" + hex;
            }
            sb.append(hex.toUpperCase());
        }

        return sb.toString();
    }

    /**
     * Hex转byte[],两种情况,Hex长度为奇数最后一个字符会被舍去
     */
    public static byte[] hexTobytes(String hex) {
        if (hex.length() < 1) {
            return null;
        } else {
            byte[] result = new byte[hex.length() / 2];
            int j = 0;
            for (int i = 0; i < hex.length(); i += 2) {
                result[j++] = (byte) Integer.parseInt(hex.substring(i, i + 2), 16);
            }
            return result;
        }
    }
}

 

原创文章,欢迎转载,转载请注明出处!

posted @ 2024-09-11 14:27  贾树丙  阅读(17)  评论(0编辑  收藏  举报