對NSUserDefaults,sqlite存儲文件數據加密,保護賬號和關鍵信息算法
將文件進行加密sql
// 獲取須要加密文件的二進制數據
NSData *data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];
// 或 base64EncodedStringWithOptions
NSData *base64Data = [data base64EncodedDataWithOptions:0];
// 將加密後的文件存儲到桌面
[base64Data writeToFile:@"/Users/wangpengfei/Desktop/123" atomically:YES];
複製代碼
將文件進行解密shell
// 得到加密後的二進制數據
NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/123"];
// 解密 base64 數據
NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
// 寫入桌面
[baseData writeToFile:@"/Users/wangpengfei/Desktop/IMG_5551.jpg" atomically:YES];
複製代碼
對程序中出現的URL進行編碼加密,防止URL被靜態分析數據庫
編碼sass
+ (NSString *)encodeToPercentEscapeString: (NSString *) input
{
NSString *outputStr =
(__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL, /* allocator */
(__bridge CFStringRef)input,
NULL, /* charactersToLeaveUnescaped */
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return outputStr;
}
複製代碼
解碼安全
+ (NSString *)decodeFromPercentEscapeString: (NSString *) input
{
NSMutableString *outputStr = [NSMutableString stringWithString:input];
[outputStr replaceOccurrencesOfString:@"+"
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0,[outputStr length])];
return
[outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
複製代碼
編碼bash
+ (NSString *)encodeToPercentEscapeString: (NSString *) input { // Encode all the reserved characters, per RFC 3986 // ()
NSString *outputStr = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)input,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return outputStr;
}
複製代碼
解碼微信
+ (NSString *)decodeFromPercentEscapeString: (NSString *) input {
NSMutableString *outputStr = [NSMutableString stringWithString:input];
[outputStr replaceOccurrencesOfString:@"+"
withString:@" "
options:NSLiteralSearch
range:NSMakeRange(0, [outputStr length])];
return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
複製代碼
對客戶端傳輸數據提供加密方案,有效防止經過網絡接口的攔截獲取數據, 使用MD5加密。 把一個任意長度的字節串變換成必定長度的十六進制的大整數。網絡
注意,字符串的轉換過程是不可逆的,不能經過加密結果,反向推導出原始內容。框架
須要導入第三方框架: NSString+Hash
NSString *password = @"WangPengfei";
password = [password md5String];
NSLog(@"password1:%@", password);
複製代碼
NSString *salt = @"234567890-!@#$%^&*()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";
[password stringByAppendingString:salt];
password = [password md5String];
NSLog(@"password2:%@", password);
複製代碼
每個公司都有本身的「鹽值」,鹽值越複雜,越安全
對應用程序的方法名和方法體進行混淆,保證源碼被逆向後沒法解析代碼。 使用hopper disassembler 反編譯iPA以後不能獲得相應的方法調用信息。
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="fun.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C
createTable(){
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
}
insertValue(){
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
}
query(){
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}
ramdomString(){
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}
rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTable
touch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h #define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
複製代碼
//在上邊腳本中提到了 STRING_SYMBOL_FILE="fun.list",意思就是運行腳本的時候會到這個文件去讀取須要替換的方法名,從新寫入符號表中。
nameAction
refreshAction
複製代碼
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低
例如:網易雲易盾
關注 【網羅開發】微信公衆號,網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!
但願能夠幫助你們,若有問題可加QQ羣: 668562416 交流
若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,通過受權方可轉載,謝謝