软件安全(Software Security)就是使软件在收到恶意攻击的情形下依然能够继续正确运行及确保软件被在授权范围内合法使用的思想。
2017年5月13日,安全极客在无需物理接触、无需拆解门锁的情况下秒破智能门锁,获得所有的开锁密码,这是来自2017国际安全极客大赛GeekPwn香港站上出现的一幕。而被破解产品正是已广泛应用于自如、小猪、途家等B端市场的“果加互联网智能锁wifi公寓版”。
网络分:主动(篡改消息, 伪造,拒绝服务,回放)和被动(流量分析, 窃听)。
软件系统通常是登录成功后才能访问核心资源,控制好登录就大大提高了软件安全性。用户通过监听应用向服务器发送的请求,用工具伪造消息来攻击服务器来骗取资源,也可能通过破解手机,直接读取应用的本地文件窃取用户信息。
密码要用md5保存编码,发送时也用md5编码后的密码。md5是单向加密,相同的字符串经过md5加密得到的字符串相同,并且编码后的字符串可以当网络请求字符串,不错在非法网络字符。机密数据(如:用户名和密码)不要用普通文件读写(NSFileManager等)方法记录机密数据,用NSUserDefaults存储。
NSUserDefaults userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:value forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
不同的请求发送到不同的url,这样就增加了服务的并发处理能力。
借鉴联通VAC(增值业务平台)的AAA接口定义的消息结构,发送消息的消息有命令字cmdCode,可以便于消息的跟踪,visitTime为发送消息时的时间,key=softkey1+cmdCode+time(long)进行md5加密后混淆,phoneId为通过needPhoneIdPhone.htm从服务器获取到的字符串。softkey1为约定字符串,如:dmko%^7*(0dfsd。该消息接口能保证安全的向服务器发送请求,并得到服务合法性校验。
2015-06-23 17:59:59:943 FHL[336:807] API.m:-[API requestWithMethod:URLString:parameters:error:]:197 Debug:request paramters:{
cmdCode = 0005;
key = 24CD74EFF781C86EB2219C0BA0A5E32B;
phoneId = “ios_120e438f-9757-451d-b980-0d87824b02eb”;
pushPhoneParam = “token:9ee99652 0c1955ac be0cb7a3 afceeec9 df156e10 b7153641 bd5946f3 e7f39e7a”;
visitTime = 1435053599;
}
request url:http://test.c.cn/b/phone/a/d.htm?cmdCode=0005&key=24CD74EFF781C86EB2219C0BA0A5E32B&phoneId=ios_120e438f-9757-451d-b980-0d87824b02eb&pushPhoneParam=token%3A9ee99652 0c1955ac be0cb7a3 afceeec9 df156e10 b7153641 bd5946f3 e7f39e7a&visitTime=1435053599
imei获得方式:[[UIDevice currentDevice] identifierForVendor]
phoneId通过needPhoneIdPhone.htm从服务器获取到的字符串,其中的phoneId为默认字符串,服务器会返回正确的phoneId。
2015-06-23 18:26:54:490 FHL[362:807] API.m:-[API requestWithMethod:URLString:parameters:error:]:197 Debug:request paramters:{
cmdCode = 0000;
imei = “A196D974-4545-562EEE0A794F”;
key = 9997EF3481E78796DFED17887335EBCC;
phoneId = “ios_44545er”;
visitTime = 1435055214;
}
响应消息的key为:key= softkey2+cmdCode+time(long)进行md5加密后混淆。softkey2为约定字符串,如:drrr^7*dfsdf。消息头字段固定:cmdCode,innerMessage(提示语),result,resultKyey(服务器合法校验key),visitTime。消息体为响应结果,可能为空集。
2015-06-23 18:41:25:131 FHL[362:807] API.m:__46-[API
httpRequestWithRequest:success:failure:]_block_invoke:431 Debug:responseObject:{ body = { canMyCourierRank = 1; canNotMyCourierRankMessage = “”; cityCode = 110100; cityName = “\U5317\U4eac\U5e02”; countyCode = 110101; countyName = “\U4e1c\U57ce\U533a”; courierCode = 2125873; courierName = “\U674e\U96f6\U56db”; courierRank = 1; courierRankName = “\U4e00\U7ea7\U5148\U950b\U5b98”; courierRankUrl = “http://test.zuixiandao.cn/fhl/statics/css/images/dispatchCourierRank1_small.png”; courierType = 2; deliveryExperience = 1; downloadUrl = “”; grabCityCode = 330100; grabCityName = “\U676d\U5dde\U5e02”; grabProvinceCode = 330000; grabProvinceName = “\U6d59\U6c5f\U7701”; handoverWarnCount = 5; handoverWarnInterval = 2; handoverWarnStart = 5; hasNewVersion = 0; headPortraitUrl = 432t1426737315000; idNumber = 211481198401154411; idPic1Url = 432t1426737315000; idPic2Url = 432t1426737315000; needUpgrade = 0; provinceCode = 110000; provinceName = “\U5317\U4eac”; rankChangeContent = “”; rankChangeTitle = “”; reason = “”; receivingWarnCount = 5; receivingWarnInterval = 3; receivingWarnStart = 10; shareUrl = “http://t.cn/RAPoRa5”; statusId = 3; telCode = 0571; vehicle = 2; }; head = { cmdCode = 1001; innerMessage = “”; message = “\U7cfb\U7edf\U7e41\U5fd9\Uff0c\U8bf7\U7a0d\U540e”; result = 1; resultKey = DD4552; visitTime = 1435056084; }; }
服务器:收到消息根据约定字符串和参数产生key,比较计算的key和发送请求的key是否一致,若不一致判定为伪造消息。拿系统的当前时间和请求的visitTime比较看是否超过180秒,若超过消息返回失败(防止伪造消息)。
客户端:
收到响应消息根据约定字符串和参数产生key,比较计算的key和响应的key是否一致,若不一致判定为伪造消息。拿系统的当前时间和响应消息的visitTime比较看是否超过180秒,若超过消息返回失败(防止伪造消息)。