首页 > 编程语言 >java常用加密手段

java常用加密手段

时间:2024-05-11 10:41:07浏览次数:26  
标签:常用 加密 String 字节 new java byte uuid

虽然一般都会给APK上壳。但是拖壳还是要分析JAVa
链接:https://pan.baidu.com/s/1Qm0cF0u7RCGy174QYeVf2Q?pwd=c60g
提取码:c60g

1.隐藏字节

-将明文字符串->转为字节定义

public static void main(String[] args) throws IOException {

    String strq=new String(new byte[]{97,115,98,100});
    String str=strq.toString();
    /*
    byte[] bytesstr=str.getBytes();
    String stra= Arrays.toString(bytesstr);
    */

    ///[97, 115, 98, 100]

    System.out.println(str);
    FileOutputStream fileOutputStream=new FileOutputStream("out.txt");
    fileOutputStream.write(str.getBytes());


}

py

# 字节列表
byte_list = [26, 83, 90, 26, 78, 101, 23, 67, 112]

# 字节列表 -> python的字节数组
bs = bytearray()
for item in byte_list:
    bs.append(item)
    
# 将字节数组解码为字符串,使用 UTF-8 编码。
str_data = bs.decode('utf-8')
print(str_data)
2.uuid加密

image-20240510184433100

例如抖音请求的uuid-截取uuid字符串

int desiredLength = 8; // 指定位数

// 生成 UUID 字符串
String uuid = UUID.randomUUID().toString();

// 去除 UUID 中的连接符 "-"
String uuidWithoutHyphens = uuid.replace("-", "");

// 截取指定位数的 UUID 子字符串
String truncatedUUID = uuidWithoutHyphens.substring(0, desiredLength);

System.out.println("Truncated UUID: " + truncatedUUID);

伪造uuid

uuid-是随机的-但是可能会根据用户设备ID来随机uuid
 第一种:每次请求生成UUID,抓包,每次都不一样 --> 直接伪造。
 
 - 第二种:--设备验证功能
 - 在app刚启动,偷偷向后端发送请求,返回uuid,手机的凭证
	- app写入到本地文件 xxx.xml
	- 点击功能,发送请求 + 找到文件uuid -> 发送过去


	现象:
		- 抓包uuid固定
		- app清楚数据 & 卸载安装 -> uuid会变
		
思路:
		- 直接用固定的uuid
		- 动态生成是否能用?
		- 过程模拟
			- 启动请求,获取uuid
			- 发送请求携带
3.随机值

抖音:openudid

image-20240510185058992

String hex16=new BigInteger(80,new SecureRandom()).toString(16);
4.时间戳
String t2 = String.valueOf(System.currentTimeMillis());
String t1 = String.valueOf(System.currentTimeMillis() / 1000);
5.十六进制字符串
        int[] byte_list = {1, -26, -83, -9, -26, -78, -101, -23, -67, -112};
        StringBuilder stringBuilder=new StringBuilder();
        int byte_size=byte_list.length;
        for(int by:byte_list)
        {
            by=by&0xff;//有符合转无符号 +250
            //不满两位补0--保证位数整齐
            if(by<16)
            {
                stringBuilder.append(by);
            }
            stringBuilder.append(Integer.toHexString(by & 0xFF)); // 转换为十六进制字符串
        }
        System.out.println(stringBuilder);
6.MD5加密

抖音:X-SS-STUB

每次发送POST请求时,抖音都会携带一些请求头:
X-SS-STUB = "fjaku9asdf"

读取请求体中的数据,对请求体中的数据进行md5加密。

image-20240510192340825

String str="wsnbb";
MessageDigest messageDigest=MessageDigest.getInstance("md5");
messageDigest.update(str.getBytes("UTF-8"));
byte[] digest = messageDigest.digest();
StringBuilder stringBuilder = new StringBuilder();
for (byte b : digest) {
    stringBuilder.append(String.format("%02x", b & 0xff));
}
String hashText = stringBuilder.toString();
System.out.println(hashText);
String str="123456";
MessageDigest messageDigest=MessageDigest.getInstance("md5");
messageDigest.update(str.getBytes("UTF-8"));

//获取字节
byte[] digest = messageDigest.digest();
//可变字符串
StringBuilder stringBuilder = new StringBuilder();
for (byte b : digest) {
    int b16=b&255;//有符合转无符号
    if(b16<16)//字节补全-MD5定长
    {
        stringBuilder.append(0);
    }
    stringBuilder.append(Integer.toHexString(b16));//转16进制

}
String hashText = stringBuilder.toString();
System.out.println(hashText);
7.sha-256加密
MessageDigest messageDigest=MessageDigest.getInstance("SHA-256");
8.AES加密
  • key & iv ,明文加密。【app端】

  • key & iv ,解密。【API】

    情况A: 请求体密文(抓包乱码)
    情况B: sign,AES加密+base64编码

   String data="不该";
   String key="fd6b639dbcff0c2a1b03b389ec763c4b";
   String iv="77b07a672d57d64c";
  byte[] rawkey = key.getBytes();
//用于包装密钥 --包装向量
        SecretKeySpec AES=new SecretKeySpec(rawkey,"AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
//指定加密
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//加密
        cipher.init(Cipher.ENCRYPT_MODE, AES, ivSpec);
        
        byte[] encrypted = cipher.doFinal(data.getBytes());
9.gzip压缩

抖音注册设备:设备。

注册设备:生成一些值,值中包括: (cdid、手机型号、手机品牌....) 后端读取到时候,发现cdid是一个全新的请求。那么抖音就会生成 device_id、install_id、tt

(cdid、手机型号、手机品牌....) --> gzip压缩(字节) --> 加密 --> 密文

    String data = "HASH-RMPC";
        //字符串这里就不加密了-抖音会对该文件加密 字节数组输出流,用于存储压缩后的数据
        ByteArrayOutputStream v0_1 = new ByteArrayOutputStream();
        ///将数据压缩后写入到字节数组输出流中
        GZIPOutputStream v1 = new GZIPOutputStream((v0_1));
        v1.write(data.getBytes());
        v1.close();
        //写入压缩文件
        byte[] arg6 = v0_1.toByteArray();
        FileOutputStream fileOutputStream = new FileOutputStream("gzip.zip");
        fileOutputStream.write(arg6);


        //从字节数组中读取数据的类
        // ByteArrayInputStream v_read=new ByteArrayInputStream("gzip.zip".getBytes());
        FileInputStream fileInputStream = new FileInputStream("gzip.zip");
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int byteRead;
        while ((byteRead = fileInputStream.read()) != -1) {
            byteArrayOutputStream.write(byteRead);
        }
        byte[] byteArray = byteArrayOutputStream.toByteArray();
//GZIPOutputStream 压缩的是二进制数据,
// 而不是纯文本数据。因此,你不能简单地将压缩后的字节数组转换为字符串,并期望得到可读的文本内容。
        //从这个字节数组中读取数据的流对象
 ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);

        GZIPInputStream gzipInputStream = new GZIPInputStream(byteInputStream);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = gzipInputStream.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }

        System.out.println(out.toString("UTF-8"));
10.base64编码
        String name = "武沛齐";
        // 加密
        ///创建了一个 Base64 编码器对象,使用 Base64.getEncoder() 方法获取。
        Base64.Encoder encoder  = Base64.getEncoder();

        String res = encoder.encodeToString(name.getBytes());
        System.out.println(res); // "5q2m5rKb6b2Q"

        // 解密
        Base64.Decoder encoder1=Base64.getDecoder();
        byte[] decode = encoder1.decode(res.getBytes());
        String data = new String(decode);
        System.out.println(data); // 武沛齐

标签:常用,加密,String,字节,new,java,byte,uuid
From: https://www.cnblogs.com/Agtw/p/18186043

相关文章

  • 第一个JAVA代码
    第一个JAVA代码创建存放代码的文件夹在合适的路径中新建存放代码的文件夹。新建一个Java文件1.新建一个文件2.文件名为HelloWorld3.将后缀改为.java输入代码使用notepad++打开新建的文件,输入以下代码并保存publicclassHelloWorld{ publicstaticvoidmain(String[]a......
  • Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
    Spring中的Bean是否线程安全取决于Bean的作用域(scope)。Spring提供了几种不同的Scope,其中包括Singleton、Prototype、Request、Session、GlobalSession等。 SingletonScope(单例模式)默认情况下,SpringBean是SingletonScope,这意味着在整个应用程序上下文中只有一个实例。......
  • mysql tda 加密表
    对TDE加密的表解密,请执行如下命令:MySQL5.6  altertable<tablename>engine=innodb,block_format=default;MySQL5.7或8.0  altertable<tablename>encryption='N';......
  • JAVA下载安装配置基础
    JAVA下载安装配置基础JDK、JRE、JVMJDK:JavaDevelopmentKitJava开发者工具,他包含JRE和JVMJRE:JavaRuntimeEnvironmentJava运行时环境包含JVMJVM:JAVAVirtualMachineJave虚拟机下载配置JDK搜索下载JDK8(目前使用率较高的版本)安装JDK记住安装的路径进入高......
  • Windows 上有许多护眼软件可以帮助减轻长时间使用电脑时对眼睛的疲劳和不适感。以下是
    Windows上有许多护眼软件可以帮助减轻长时间使用电脑时对眼睛的疲劳和不适感。以下是一些常用的Windows护眼软件:f.lux:f.lux是一款免费的护眼软件,它可以根据日出和日落时间自动调整屏幕的色温,减少蓝光的影响,并且可以手动设置色温。WindowsNightLight:Windows10......
  • 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)
    问题分析intselectDeviceMonthRepairCount(StringdeviceType,Stringmonth);<selectid="selectDeviceMonthRepairCount"resultType="int">SELECTSUM(repair_count)FROMwarranty_recordsWHEREdevice_type=......
  • java代码规范
    Java代码规范规范类型规范要求命名规范-类名:大写字母开头,驼峰命名法。<br>-方法名、变量名、包名:小写字母开头,驼峰命名法。<br>-常量:全大写字母,下划线分隔单词。缩进和空格-使用4个空格进行缩进,不使用制表符。<br>-二元运算符前后应该加上空格,以增......
  • java代码评审检查表
    Java代码评审检查表编号检查项是否不适用BUG数代码行备注源文件1是否以UFT-8编码      2是否使用通配符导入      3import语句是否换行      ......
  • [转帖]Java程序在K8S容器部署CPU和Memory资源限制相关设置
    https://developer.aliyun.com/article/700701  简介: 背景在k8sdocker环境中执行Java程序,因为我们设置了cpu,memory的limit,所以Java程序执行时JVM的参数没有跟我们设置的参数关联,导致JVM感知到的cpu和memory是我们k8s的worknode上的cpu和memory大小。背景在......
  • java引入es使用
    引入依赖<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>初始化对象RestHighLevelClientclient=newRestHighLevelClient(RestClient.......