加密技巧与算法

本文探讨了加密技巧,包括隐藏字符串、UUID、随机值和时间戳的使用,深入讲解了MD5、SHA-256、AES、DES等加密算法的实现,并提到了gzip压缩和Base64编码。还特别讨论了AES加密时iv的动态变化以及RSA加密的特点。文章以Java和Python为例,提供了各种加密方法的实现代码。
摘要由CSDN通过智能技术生成

提示:只需要有个印象即可。

1.1 加密技巧

1.1.1 隐藏字符串
// 显式
TreeMap map = new TreeMap();
map.put("sign", x);

// 隐式
String a = new String(new byte[]{
   -26, -83, -90, -26, -78, -101, -23, -67, -112});
TreeMap map = new TreeMap();
map.put(a, x);
    
// hook机制,找到TreeMap中的put方法,替换成自己的某个方法
function newPut(key, value){
   
    console.log(key, value); 
}

隐藏关键字 salt

String salt = "xxssasdfasdfadsf";

提醒:MD5加密盐、AES加密key、iv

示例:

// java字节:有符号 -128 ~ 127 ,对于java中负号的字节,+256后变成python中对应的字节
// python:无符号  0 ~ 255
byte_list = [-26, -83, -90, -26, -78, -101, -23, -67, -112]

bs = bytearray()  # python字节数组
for item in byte_list:
    if item < 0:
        item = item + 256
    bs.append(item)

str_data = bs.decode('utf-8')  
print(str_data)
# 类似于Java中的字节数组
data = "张三懵逼了"
data_bytes = data.encode('utf-8') # encode后变成了二进制数据


data_list = bytearray()
for item in data_bytes:
    data_list.append(item)

res = data_list.decode('utf-8')
print(res)

当搜索不到关键字的位置时:

  • 搜索关键字的字节数组,如sign的字节数组为 {-26, -83, -90, -26, -78, -101, -23, -67, -112}
  • 利用Hook机制,改写关键方法

如何获取sign在Java中的字节数组是什么?

data_bytes = "sign".encode('utf-8')
data_list = [] 
for item in data_bytes:
    if item > 127:
        item = item - 256
    data_list.append(item)
print(data_list)
1.1.2 uuid

抖音udid
在这里插入图片描述

java实现:

import java.util.UUID;

public class Hello {
   
    public static void main(String[] args){
   
        String uid = UUID.randomUUID().toString();
        System.out.println(uid);
    }
}

python实现:

import uuid

uid = str(uuid.uuid4())
print(uid)
29cd5f50-4b4c-457b-9a59-33a12e3edd10
发现uuid,可以随机生成一个进行尝试

1.第一类使用uuid
	抓包发现,每次请求值不一样:d7cb3695-5105-4aaa-b0a8-8188e0977143

2.第一次运行生成UUID
	- 刚开始运行:调用uuid算法生成一个值
	- 写入XML文件
	- 再使用
		- 优先去XML文件中找
		- uuid算法

	此时测试:
		- 清除app数据
		- 必须卸载app,重新安装
		
3.卸载app后,重新安装,uuid还是不变,uuid可能是根据手机的指纹信息(CPU,硬盘,各种ID,各种信息)生成的,换一部手机则uuid会发生变化

4.也有写死的情况
1.1.3 随机值

抖音:openudid
在这里插入图片描述

java实现:

import java.math.BigInteger;
import java.security.SecureRandom;

public class Hello {
   

    public static void main(String[] args) {
   
        // 随机生成80位,也就是10个字节
        BigInteger v4 = new BigInteger(80, new SecureRandom());
        // 让字节以16进制展示
        String res = v4.toString(16);
        System.out.println(res); // db1224a36463085502c3
    }
}

python实现:

import random

data = random.randbytes(10)  # python3.9及以上版本支持
# b'\xff\xe0\xe8\xa6\x03\xb2\x1e\xbb\xf1{'

print([item for item in data]) 
# [54, 184, 19, 18, 24, 40, 3, 71, 37, 85]

print([hex(item) for item in data]
  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值