本文思路
- 拿到a-Z的ASCII码
- 定义一个key
- 指定key的某几位获取ASCII码并且相加得出的值做最终解码值(keyNum)
- keyNum+对应方法名的每一位的ASCII码 , 向左偏移三位然后转换为16进制 , 获取简单加密后的对应字符串, 保存下来(cStrArr)
此处可以进行很多优化, 比如a-Z的ASCII数组打乱, 给更加复杂的加密算法, 这里我只是为了做探索, 所以简化了很多, 但是有一点需要注意 这个加密过程应当是后端完成返回前端的
- 给出fnName数组为cStrArr下标
- 逆运算解出真实方法名并且调用
ps: 做混淆调用只是一个防君子不防小人的手段, 因为肯定是要前端进行解码的, 所以相当于门上挂了把锁, 给正常人不会去看的门框上面又放了一个钥匙
// 这里应该是服务端去做的事情
// 生成基础a-Z的ASCII数组
let StrArr = []
for(let i = 65 ; i <= 122; i++){
if(i>90 && i<97){
continue;
}
StrArr.push(i)
}
// 定义加密数组
let cStrArr = []
// 定义一个加密和解密的key
let key = "lidppp"
// 获取一个keyNum做加密使用
// 这里我是图方便写死的, 但其实应该随机去抓某几位的
let keyNum = key[0].charCodeAt() + key[3].charCodeAt()
// 进行简单的加密计算, 将结果存入加密数组中
for(let i = 0; i < StrArr.length; i++){
cStrArr.push(((StrArr[i] + keyNum) << 3).toString(16))
}
// 注意 此处应当为客户端方法了
// 随便定义个方法
function nzD(){console.log("nzD Fn")}
// 调用的方法名字
// 这里面存放的是 cStrArr的下标
let fnName = [39,51,3]
// 解密真实调用方法名
let evalFnName = ""
// 进行逆运算
for(let i = 0; i < fnName.length; i++){
evalFnName += String.fromCharCode((parseInt(cStrArr[fnName[i]],16) >> 3) - keyNum)
}
// 这里我试过 script标签插入body, eval调用....
// Chrome安全策略都不让运行...就很烦,索性直接window调用了,
// 其实可以把方法挂到某个Object下面去调用
window[evalFnName]() // log: nzD Fn