數(shù)據(jù)安全
-
數(shù)據(jù)安全的原則
1)在網(wǎng)絡(luò)上"不允許"傳輸用戶隱私數(shù)據(jù)的"明文"
2)在本地"不允許"保存用戶隱私數(shù)據(jù)的"明文" - 請(qǐng)求的方法
- 一定要使用POST請(qǐng)求提交用戶的隱私數(shù)據(jù)
這個(gè)請(qǐng)求的方式,可以將于用戶相關(guān)的信息全部放在一個(gè)請(qǐng)求體內(nèi),不會(huì)暴露在請(qǐng)求的URL中 - GET請(qǐng)求的所有參數(shù)都直接暴露在了URL中
這個(gè)請(qǐng)求的方式,會(huì)將用戶的私人信息暴露在請(qǐng)求的URL內(nèi),不利于私人信息的保密 - 請(qǐng)求的URL一般會(huì)記錄在服務(wù)器的訪問日志中
- 服務(wù)器的訪問日志是黑客攻擊的重點(diǎn)對(duì)象之一
-
用戶的隱私數(shù)據(jù)都包含哪些
用戶的隱私數(shù)據(jù),一般都包含用戶的賬號(hào)/密碼,銀行的賬號(hào)等等 -
數(shù)據(jù)攔截的方式
1.數(shù)據(jù)的攔截有多種多樣的方式,作為編程人員,平時(shí)最常做的接口驗(yàn)證,需要攔截?cái)?shù)據(jù),查看請(qǐng)求到的數(shù)據(jù)是否正常,這里常用的到軟件是Charles
2.平時(shí)僅僅使用POST請(qǐng)求提交用戶的隱私數(shù)據(jù),還是不能完全的解決安全問題,因?yàn)榭梢允褂密浖?比如Charles),通過設(shè)置代理服務(wù)器,可以攔截并查看手機(jī)客戶端的請(qǐng)求數(shù)據(jù),因此,在提交用戶的隱私數(shù)據(jù)時(shí),一定不要明文(包括POST請(qǐng)求方式中的請(qǐng)求體內(nèi)管用用戶隱私的內(nèi)容)提交,必須要加密處理后再提交 - 信息安全所面臨的威脅
- 機(jī)密性(面臨著被竊聽,秘密泄露的威脅)
- 完整性(面臨著被篡改,信息被修改的威脅)
- 認(rèn)證(偽裝,指的是偽裝成通信雙方,以成功獲取對(duì)象的認(rèn)證)
-
不可否認(rèn)性(否認(rèn),是指事后不承認(rèn)是自己發(fā)送的)
-
常用的加密算法
最常用的加密算法用如下幾種:
MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \RSA \ IDEA \ DSA \ AES -
加密算法的選擇
一般公司都會(huì)有一套自己的加密方案,按照公司接口文檔的規(guī)定去加密
常見的加密算法
-
Base64編碼
-
簡單說明
- HTTP將Base64編碼用于基本的認(rèn)證和摘要認(rèn)證
- 其可以方便的將用戶的任何輸入轉(zhuǎn)換成只包含特定字符的安全格式,服務(wù)于網(wǎng)絡(luò)通信過程
- Base64可以成為密碼學(xué)的基石谷扣,非常重要碍沐。
-
特點(diǎn):
- 可以將任意的二進(jìn)制數(shù)據(jù)進(jìn)行Base64編碼
- 所有的數(shù)據(jù)都能被編碼為,只用65個(gè)字符就能表示的文本文件。
- 編碼后的65個(gè)字符包括 : A~Z a~z 0~9 + / =
- 對(duì)文件進(jìn)行base64編碼后文件數(shù)據(jù)的變化:編碼后的數(shù)據(jù) 約等于 編碼前數(shù)據(jù)的4/3躏升,會(huì)比原始的數(shù)據(jù)大1/3(33%)左右。
- 能夠進(jìn)行逆運(yùn)算
- 不夠安全,但卻被很多加密算法作為編碼格式
-
通過"終端命令行"實(shí)現(xiàn)Base64編碼和解碼
編碼:base64 123.png -o 123.txt
解碼:base64 123.txt -o test.png -D
- Base64編碼原理
1)將所有字符轉(zhuǎn)化為ASCII碼池凄;
2)將ASCII碼轉(zhuǎn)化為8位二進(jìn)制蜡感;
3)將二進(jìn)制3個(gè)歸成一組(不足3個(gè)在后邊補(bǔ)0)共24位,再拆分成4組打月,每組6位;
4)統(tǒng)一在6位二進(jìn)制前補(bǔ)兩個(gè)0湊足8位蚕捉;
5)將補(bǔ)0后的二進(jìn)制轉(zhuǎn)為十進(jìn)制奏篙;
6)從Base64編碼表獲取十進(jìn)制對(duì)應(yīng)的Base64編碼;
- 處理過程
a.轉(zhuǎn)換的時(shí)候迫淹,將三個(gè)byte的數(shù)據(jù)秘通,先后放入一個(gè)24bit的緩沖區(qū)中,先來的byte占高位敛熬。
b.數(shù)據(jù)不足3byte的話肺稀,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后荸型,每次取出6個(gè)bit盹靴,按照其值選擇查表選擇對(duì)應(yīng)的字符作為編碼后的輸出。
c.不斷進(jìn)行瑞妇,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成稿静。
d.如果最后剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=”辕狰;
e.如果最后剩下一個(gè)輸入數(shù)據(jù)改备,編碼結(jié)果后加2個(gè)“=”;
f.如果沒有剩下任何數(shù)據(jù)蔓倍,就什么都不要加悬钳,這樣才可以保證資料還原的正確性。
-
編碼&解碼方式
編碼- 編碼方式一 : 通過將給定的字符串轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)后進(jìn)行Base64編碼,輸出的編碼結(jié)果是一個(gè)二進(jìn)制數(shù)據(jù)
方法 :-(NSData*)base64EncodedDataWithOptions(NSDataBase64EncodingOptions);
返回的是NSData
- 編碼方式一 : 通過將給定的字符串轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)后進(jìn)行Base64編碼,輸出的編碼結(jié)果是一個(gè)二進(jìn)制數(shù)據(jù)
-(NSString *)base64Encodeing1:(NSString *)string
{
//將字符串轉(zhuǎn)換成二進(jìn)制
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
//對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼
NSData * codeData = [data base64EncodedDataWithOptions:0];
//將編碼后的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成字符串后輸出
return [[NSString alloc] initWithData:codeDataencoding:NSUTF8StringEncoding];
}
- 編碼方式二 : 將給定的字符串轉(zhuǎn)換成二進(jìn)制后,進(jìn)行Base64編碼,輸出的編碼結(jié)果是字符串
- (NSString *)base64EncodedStringWithOptions(NSDataBase64EncodingOptions);
返回的是NSString
-(NSString *)base64Encodeing2:(NSString *)string
{
//將字符串轉(zhuǎn)換成二進(jìn)制
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
//將二進(jìn)制數(shù)據(jù)通過base64編譯成字符串
return [data base64EncodedStringWithOptions:0];
}
解碼
- 解碼方式一 : 通過將經(jīng)過Base64編碼后的字符串轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)后,進(jìn)行解碼
-(nullable instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions);
上邊的方法是NSData的方法,通過一個(gè)二進(jìn)制數(shù)據(jù),返回的實(shí)例對(duì)象是NSData對(duì)象
-(NSString *)base64Decodeing1:(NSString *)string
{
//將字符串轉(zhuǎn)換成二進(jìn)制
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
//將二進(jìn)制數(shù)據(jù)通過base64進(jìn)行解碼
NSData * deCode = [[NSData alloc] initWithBase64EncodedData:data options:0];
//將解碼 后的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成字符串
return [[NSString alloc] initWithData:deCode encoding:NSUTF8StringEncoding];
}
- 解碼方式二 : 直接將經(jīng)過Base64編碼后的字符串進(jìn)行解碼
-(nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions);
上邊的方法是NSData的方法,通過一個(gè)字符串,返回一個(gè)實(shí)例對(duì)象是NSData的對(duì)象
-(NSString *)base64Decodeing2:(NSString *)string
{
//解碼字符串,并轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
NSData * deCodeData = [[NSData alloc] initWithBase64EncodedString:string options:0];
//將解碼后的二進(jìn)制數(shù)據(jù),轉(zhuǎn)換成字符串,并返回
return [[NSString alloc] initWithData:deCodeData encoding:NSUTF8StringEncoding];
}
常見的其他加密算法
-
常見的加密算法
- 消息摘要(單向散列函數(shù))包括:MD5 \ SHA1 \ SHA256 \ SHA512等
- 消息認(rèn)證 包括 : HMAC-MD5 \ HMAC-SHA1
- 對(duì)稱加密 包括 : DES \ 3DES \ AES(高級(jí)加密標(biāo)準(zhǔn))
- 非對(duì)稱加密 包括 : RSA
- 數(shù)字簽名
- 證書等