為什么要保證API安全
- 防止別人隨便調(diào)用你的api
- 保證傳輸數(shù)據(jù)的安全
設(shè)計簽名
防止別人調(diào)用你的API其實并不難,通常做法是在調(diào)用API益缎,使用和服務(wù)端共用的一個秘鑰,根據(jù)API請求的名字和API請求的參數(shù)算出一個hash來然想,然后請求的時候帶上這個hash莺奔。服務(wù)端收到請求之后,使用同樣的秘鑰和算法hash变泄,然后進行比較令哟,如果一致,說明這個API的調(diào)用者就是你自己妨蛹。
NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; //初始化字典
[parameters setObject:@"1" forKey:@"a"]; //參數(shù)a
[parameters setObject:@"2" forKey:@"b"]; //參數(shù)b
NSArray *parameterKeys = [parameters allKeys]; //得到字典中所有的key
parameterKeys = [parameterKeys sortedArrayUsingSelector:@selector(compare:)];// 字符串編碼升序排序
NSString *signData = @"";
for (int i = 0; i < [parameters count]; i++) { //遍歷字典
NSString *_key = parameterKeys[i];
NSString * _value = parameters[_key];
signData = [NSString stringWithFormat:@"%@%@=%@", signData, _key, _value]; //將字典中的參數(shù)拼接
if (i < ([parameters count] - 1)) {
signData = [signData stringByAppendingString:@"=*="];
}
}
//拼接完之后signData = a=1=*=b=2
NSString *signDataKey = [signData stringByAppendingString:@"KEY"]; //拼接秘鑰
NSString *s = [signDataKey md5]; //hash出一個參數(shù)
[parameters setObject:s forKey:@"s"]; //添加在請求參數(shù)中
這只是很簡單一個例子屏富,實際中應(yīng)當(dāng)適當(dāng)增加算法的復(fù)雜度。當(dāng)然這并不能解決所有問題滑燃,比如抓到你的API役听,還是能反復(fù)請求同樣的API。所以算法中可以增加app的本地信息或者加上時間戳。
這樣同樣有弊端典予,如果更換key甜滨,那么對舊版本的兼容會帶來問題。解決方法就是將秘鑰進行可逆加密后一起放在請求參數(shù)中瘤袖,服務(wù)端拿到加密后的秘鑰和hash之后衣摩,解碼得到原始的秘鑰,然后用它去算hash捂敌,再進行比較艾扮。
傳輸安全
互聯(lián)網(wǎng)發(fā)展到今天,大家越來越重視自己的隱私占婉,各大公司也越來越重視數(shù)據(jù)的安全泡嘴。傳輸過程中的數(shù)據(jù)安全解決方案主要是HPPTS,能夠有效防止中間人攻擊等逆济。但是API中重要的參數(shù)還是要進行加密酌予,常用DES或者AES進行加密。有見過API中密碼直接MD5后就行傳輸奖慌,但是MD5在2009年謝濤和馮登國僅用了220.96的碰撞算法復(fù)雜度抛虫,破解了MD5的碰撞抵抗,該攻擊在普通計算機上運行只需要數(shù)秒鐘(引自維基百科)简僧。
總結(jié)
安全是一個永恒的話題建椰,隨著各大網(wǎng)站全站https的推進,安全也越來越被重視岛马。簽名設(shè)計大家必須有棉姐,HTTPS希望大家有。