记得前些时候发过一篇文章,谈到某app 数据库加密算法用的是AES128,,当时偷懒,是直接打印的key, 没有研究其key 的生成算法,近日又看了看,发现其生成key的算法如下:
public static finalString genCipherKey() {
try{
StringBuilder sb =newStringBuilder();
sb.append(Build.MODEL).append(SEPERATOR).append(Build.CPU_ABI).append(SEPERATOR).append(Build.BOARD).append(SEPERATOR).append(Build.HARDWARE).append(SEPERATOR).append(Build.DEVICE); // 这句是关键
String raw = sb.toString();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(raw.getBytes());
returna(md.digest());
}catch(Throwable th) {
return null;
}
}
private staticString a(byte[] src) {
if(src ==null|| src.length<=0) {
returnSTRING_EMPTY;
}
StringBuilder hex =newStringBuilder(src.length*2);
byte[] temp = src;
intlen$ = src.length;
for(inti =0; i < len$; i++) {
intv = temp[i] &255;
if(v <16) {
hex.append(ATTACHMENT_DOWNLOAD_FILE_TYPE_NORMAL);
}
hex.append(Integer.toHexString(v));
}
returnhex.toString();
}
就是把手机的各种信息用 ”/" 连接成一个字符串,然后取其md5 值。 若key 小于16位, 则于字符串"0" 补足16位
sb.append(Build.MODEL).append(SEPERATOR).append(Build.CPU_ABI).append(SEPERATOR).append(Build.BOARD).append(SEPERATOR).append(Build.HARDWARE).append(SEPERATOR).append(Build.DEVICE);
SEPERATOR 是 "/"
写个程序验证了一下,果然与打印的一致:
完。