由于需要采集网易新闻的关键词搜索用户并且采集用户发文
爬虫太难混了,简单分析下一般参数加密的思路
通过抓包发现参数sign加密且服务端有校验
通过 jadx 查看apk客户端源码 搜索 “sign” 相关的字段 最终定位到
str9是a2和时间戳组成,然后通过加密得出sign,点进去发现加密调用了native方法
通过IDA打开librandom.so文件并且找到encrypt方法,发现是静态注册
通过F5转为C代码
进入到doEn方法中,很容易分辨出是是AES或者DES加密方式
转为java代码
结果图
完整代码
public class AES {
private static String iv = "00000000000000000000000000000000";//偏移量
private static String key = "neteasenewsboard";//秘钥
private static final String ALGORITHM = "AES/ECB/PKCS5Padding";//"算法/模式/补码方式"
private static Cipher cipher;
/**
* 加密
*
* @param sSrc 需要加密的字符串
* @return
* @throws Exception
*/
public static String encrypt(String sSrc) {
try {
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance(ALGORITHM);//"算法/模式/补码方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
} catch (Exception e) {
return null;
}
}
/**
* 解密
*
* @param sSrc 需要解密的字符串
* @return
* @throws Exception
*/
public static String decrypt(String sSrc) {
try {
byte[] raw = key.getBytes();
SecretKeySpec skc = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, skc);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
} catch (Exception e) {
return null;
}
} catch (Exception ex) {
return null;
}
}
public static void main(String[] args) {
System.out.println(AES.encrypt("d74d52a7ccdd3a291c8bf1329d0ffd4b"));
System.out.println(AES.decrypt("A5j4pBHLPAVcYrsPFf99Mj1vW3Wpgvf9/DLIHMfzogx48ErR02zJ6/KXOnxX046I"));
}
}