項目所有接口都未加密,結果別人抓接口,篡改了支付信息,我們就悲劇了,被別人刷單,損失挺嚴重的,這也是第一次接觸安全問題。
現在項目要求使用RSA加密,所以了解了一下。
加密解密有兩種方式
一種是通過生成的證書后綴為.der(公鑰)和.p12(私鑰)
一種是使用公鑰私鑰字符串
具體的流程可以看下面的參考網址或者Demo,都是一些大神寫好的。
加密解密過程
一般來說都是使用兩套.
客戶端將請求參數使用A公鑰加密傳給服務器,服務器通過A秘鑰解密
將返回數據通過B公鑰加密,客戶端通過B私鑰解密。
客戶端向服務器請求時:
1.將請求參數轉化成json格式的字符串。
2.將字符串進行使用公鑰分段加密,放進數組
3.將數組轉化成json格式的字符串傳給服務器
服務器返回數據時:
1.返回數據為json格式,轉化為數組
2.便利數組,分段解密,使用字符串拼接解密后的結果
3.注意,這個時候字符串還是json格式,需要將json格式的字符串轉化為數組。
在解析返回數據的時候迷茫了不少,一直覺得NSString就是OC的字符串,不能轉化成字典,沒想過如果里面包裹的是json格式的字符串,是可以轉換成字典的。
注意點:
給后臺傳數據的時候,注意要分段加密。
RSA非對稱加密內容長度有限制,比如 Java 默認的 RSA 加密實現不允許明文長度超過密鑰長度減去 11(單位是字節,也就是 byte),生成的密鑰長度就是 1024位 / 8位/字節 = 128字節,那么我們需要加密的明文長度不能超過 128字節 -11 字節 = 117字節。也就是說,我們最大能將 117 字節長度的明文進行加密。
做法很簡單,在加密之前將字符串截成一段一段的,我們是以25個字符為單位進行截取。
//轉換json格式的時候注意
//數組轉換json格式
NSError *error;
// 如果是要字符串類型的{@"a":"1",@"b":"1"},使用 options:kNilOptions
NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:kNilOptions error:&error];
if (!error) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}else{
return nil;
}
//分段加密
//分段加密
- (NSString*)rsa:(NSString*)str{
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < str.length; i = i + 25 ) {
if ((i + 25) > str.length ) {
NSString *RSAStr = [RSAUtil encryptString:[str substringWithRange:NSMakeRange(i, str.length - i)] publicKey:RSA_Public_key];
[arr addObject:RSAStr];
}else{
NSLog(@"%@ ---",[str substringWithRange:NSMakeRange(i,25)]);
NSString *RSAStr = [RSAUtil encryptString:[str substringWithRange:NSMakeRange(i,25)] publicKey:RSA_Public_key];
[arr addObject:RSAStr];
}
if ((i + 25) == str.length) {
break;
}
}
NSError *error;
// 如果是要字符串類型的{@"a":"1",@"b":"1"},使用 options:kNilOptions
NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:kNilOptions error:&error];
if (!error) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}else{
return nil;
}
}
參考網址:
http://www.lxweimin.com/p/74a796ec5038
http://www.cnblogs.com/Erma-king/archive/2016/03/31/5340088.html
http://www.lxweimin.com/p/86f9a1ef3f24/comments/1632653
http://www.lxweimin.com/p/4170eac55442