五叶神
五叶神
  • 发布:2017-08-23 17:01
  • 更新:2020-03-11 14:48
  • 阅读:13327

【交流分享】Dcloud开发APP心得系列之接口安全加密篇

分类:HTML5+

================ 补充 ====================

此方法已被 @wenju 大神验证无效,仅作参考,还是开启混淆 js吧

==============================================================================

继代码性能优化篇再来一波。。。

使用Dcloud开发APP以来大家讨论关注比较多的问题估计就是APP代码安全性问题,很多人都在考虑加密、代码混淆啊,因为打包好的apk、ipa可以直接解压从中找到完整的页面文件,包括HTML、css、js代码等,怕怕。。。这样另有目的的人会不会直接copy你的代码打包新的APP?

其实我觉得那些静态页面根本就不值钱,就像web网页一样,照样能扒下所有的静态文件。打包时使用代码混淆功能感觉也得不偿失,消耗资源,影响APP性能。整个APP里面其实唯一值得保护的就只有manifest.json文件里面的sdk配置以及你的后台API数据接口,manifest.json文件配置Dcloud已经处理过了,所有是相对安全的。

能看到你的代码就能使用你的接口,那怎么保证你的接口数据是安全的?提供一个解决方案:

1、用户信息的储存

用户登录后存储用户唯一标识userkey加密串至localStorage,后续所有的用户相关数据获取传userkey参数获取。

2、接口签名认证机制

接口除传正常参数外再补加几个加密用参数:
timestamp:时间戳,获取客户端当前时间,如果时间差与服务器超过五分钟,则请求失败
appkey:签名appkey
sign:接口签名参数,使用md5摘要算法处理一定规律的字符串,所有接口需要参数 + timestamp + appkey + 按参数名排序后拼接成字符串(参数名+值)+ appsecret;

封装成一个统一处理接口data参数的方法

app.md5Data=function(oldData){  
	var data=JSON.parse(JSON.stringify(oldData||{})) //保存原始数据  
	data.appkey=appkey;  
	data.timestamp =new Date().toUTCString();    //**由于国外访问存在时差,会导致时间戳验证失败,故此处改为UTC标准时间,服务端处理转换**  
	var keys=[];  
	for(var k in data){  
		if(data[k]===0||data[k]===false||data[k]){  
			keys.push(k);  
		}else{  
			delete data[k]; //剔除空参数  
		}  
	}  
	  
	keys=keys.sort();  
	var signStr='';  
	for(var i=0; i<keys.length; i  ){  
		signStr =keys[i].toLowerCase()+data[keys[i]];  
	}  
	  
	data.sign=md5(signStr+appsecret);  
	return data;  
}

处理后的data为:

{  
	pageno: page,  
	pagesize: 20,  
	userkey: userkey,  
	type: type,  
	timestamp:'2017-08-23 16:39:50',  
	appkey:'.....',  
	sign:'A765E24767546E1109B5576538C87FF6'  
}  
  
mui.ajax({  
    data:app.md5Data({ .... })  
})

后台进行同样的方式生成sign,如果配对不一致则请求失败。

那么问题又来了,appkey、appsecret存储在哪里?肯定不能直接写死在js中,那样就没意义了,目前采用的方法是获取manifest.json配置的某个第三方sdk的appid,appkey,最后发现只有个推的配置信息是提供了方法获取的,果断使用plus.push.getClientInfo().appkey 、appsecret获取配置文件中的值(解压是获取不到sdk配置的)。

当然也可以直接写了上述方法的js文件打包的时候启用js原生混淆,这样明文写死也没有关系,解压打开你的app.js看到的全是乱码,只是不支持安卓4.0以下手机。

补充:没有提供获取方法的sdk配置也是可以通过native.js获取到(真不知道安不安全),方法链接: https://ask.dcloud.net.cn/article/488

这样就算别人拿到你的源码,也无法请求到你API接口的任何数据。

注:目前只想到这个方法存储appkey、appsecret,或许大家有更靠谱的方法存储,欢迎交流。

代码精简、性能优化篇

7 关注 分享
lhyh DCloud_heavensoft Trust uniapper Marco 3***@qq.com 绿萝根

要回复文章请先登录注册

l***@live.com

l***@live.com

mark mark
2020-03-11 14:48
c***@ccfish.net

c***@ccfish.net

一般使用https加body/header传递信息。追加抓包难度吧
2019-12-18 11:07
廖强

廖强

代码中循环keys的时候i++

app.md5Data=function(oldData){
var data=JSON.parse(JSON.stringify(oldData||{})) //保存原始数据
data.appkey=appkey;
data.timestamp =new Date().toUTCString(); //**由于国外访问存在时差,会导致时间戳验证失败,故此处改为UTC标准时间,服务端处理转换**
var keys=[];
for(var k in data){
if(data[k]===0||data[k]===false||data[k]){
keys.push(k);
}else{
delete data[k]; //剔除空参数
}
}

keys=keys.sort();
var signStr='';
for(var i=0; i<keys.length; i++){
signStr =keys[i].toLowerCase()+data[keys[i]];
}

data.sign=md5(signStr+appsecret);
return data;
}
2019-11-04 20:56
五叶神

五叶神 (作者)

回复 wenju :
哈哈,那好吧,不管了
2018-10-23 14:02
wenju

wenju

回复 五叶神 :
manifest.json确实没有 反编译的其他xml文件有写 官方无论怎么混淆 对于android开发的人 获取这些配置信息是很简单的 o(* ̄︶ ̄*)o
2018-10-19 13:43
五叶神

五叶神 (作者)

回复 wenju :
我帮你补上,哈哈
@五叶神 我在应用宝下载了你的himall.apk 解压后查看到你的app信息有:
package="com.HiShop.HiMall"
android:versionCode="101"
android:versionName="3.3"

推送的信息:
"PUSH_APPID" = "152*****83"
"PUSH_APPKEY" = "ha*****d4"
"PUSH_APPSECRET" = "64b*****13b13"

微信支付信息:
"WX_APPID" = "wxf*****65"
"WX_SECRET" = "94******e2"

其他:
"QQ_APPID" = "11*****83"
"DCLOUD_AD_ID" = "49*****618"
"com.baidu.lbsapi.API_KEY" = "huO*****Awmglv"
2018-10-19 11:39
Trust

Trust

回复 wenju :
由于你之前的回复不小心暴露了楼主的一些私密信息,已经按照楼主的要求,删除了之前的回复内容。请在交流技术时,注意下关键/敏感信息的保密。o(∩_∩)o
2018-10-19 11:35
五叶神

五叶神 (作者)

回复 wenju :
。。。 manifest.json里面没有这些信息,你在哪里找到的? 打包竟然没有加密这些信息? 那无解了,哈哈
2018-10-19 11:23
五叶神

五叶神 (作者)

回复 青椒茄子 :
https://demo.himall.kuaidiantong.cn/app/himall.apk
2018-07-13 08:59
五叶神

五叶神 (作者)

回复 青椒茄子 :
解压了看不到 manifest.json中的sdk配置的,我加密用的appkey appsecret是存在sdk配置里面的,就跟你微信appid一样,解压也是看不到的,你可以试试解压我的包看看能不能找到,能不能请求到我的接口数据,应用宝搜 himall下载apk解压就行
2018-07-13 08:51