Questions?
- 我通過app向服務器發送一條登錄的請求,那么這個請求里面肯定會包含用戶名和密碼等相關的信息,如果這個時候沒有對數據進行處理,那么我現在使用抓包工具就可以很容易得抓取到你的用戶名和密碼,而且大部分人還喜歡設置相同的密碼(支付寶之類的),那么這個時候我的信息就很危險了,怎么辦?
- 我怎樣能證明這個信息是我希望的對象發給我的呢?
- 如何服務器被黑客入侵了怎么辦?在數據庫中存放的數據怎么辦?
Answers?
- 1 根據自己的具體需求選擇合適的加密算法對需要傳輸的信息進行加密。加密算法可以疊加使用;
- 2 驗簽
- 3 將需要保存到服務器的關鍵性數據進行加鹽處理
一. 常見的加密算法:
1.1 base64加密
base64 編碼是現代密碼學的基礎
基本原理:
原本是 8個bit 一組表示數據,改為 6個bit一組表示數據,不足的部分補零,每 兩個0 用 一個 = 表示
用base64 編碼之后,數據長度會變大,增加了大約 1/3 左右.(8-6)/6
可進行反向解密編碼有個非常顯著的特點,末尾有個 = 號
//文件加密
// 獲取需要加密文件的二進制數據
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];
//文件解密
// 獲得加密后的二進制數據
NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/xxx/Desktop/123"];
// 解密 base64 數據
NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
// 寫入桌面
[baseData writeToFile:@"/Users/xxx/Desktop/IMG_5551.jpg" atomically:YES];
1.2 MD5 (信息-摘要算法) 哈希算法之一
基本原理:
把一個任意長度的字節串變換成一定長度的十六進制的大整數.注意,字符串的轉換過程是不可逆的,不能通過加密結果,反向推導出原始內容
MD5 特點:
壓縮性 : 任意長度的數據,算出的 MD5 值長度都是固定的.
容易計算 : 從原數據計算出 MD5 值很容易.
抗修改性 : 對原數據進行任何改動,哪怕只修改一個字節,所得到的 MD5 值都有很大區別.
弱抗碰撞 : 已知原數據和其 MD5 值,想找到一個具有相同 MD5 值的數據(即偽造數據)是非常困難的.
5.強抗碰撞: 想找到兩個不同數據,使他們具有相同的 MD5 值,是非常困難的
MD5 應用:
一致性驗證:MD5將整個文件當做一個大文本信息,通過不可逆的字符串變換算法,產生一個唯一的MD5信息摘要.就像每個人都有自己獨一無二的指紋,MD5對任何文件產生一個獨一無二的數字指紋.
利用 MD5 來進行文件校驗,被大量應用在軟件下載站,論壇數據庫,系統文件安全等方面(是否認為添加木馬,篡改文件內容等).
數字簽名;
安全訪問認證;
MD5 使用:
利用 MD5 對字符串進行加密
NSString *password = @"Hello";
password = [password md5String];
加鹽,可以保證 MD5加密之后更加安全
NSString *salt = @"234567890-!@#$%^&*()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";
[password stringByAppendingString:salt];
password = [password md5String];
每一個公司都有自己的“鹽值”,鹽值越復雜,越安全
加鹽:
- 在密碼學中,是指通過在密碼任意固定的位置插入特定的字符串,讓散列后的節后和使用原始數據的結果不相符,之后再多次求MD5,之后在和服務器原先存儲的用同樣的方法處理過的密碼匹配,如果一直,則登錄成功。
- 加鹽的作用主要是防止服務器數據被盜,所以不在服務器中存儲原始數據,MD5又是不可逆的算法,所以保證了服務器數據的安全性。
1.3 AES加密:對稱加密,隨機生成一個 AESkey,運算速度較快。
1.4 RSA加密:非對稱加密生成一對公鑰私鑰,運算速度較慢。
二 . 加密和認證的原理
2.1 加密和認證
- 加密是將數據資料加密,使得非法用戶即使取得加密過的資料,也無法獲取正確的資料內容,所以數據加密可以保護數據,防止監聽攻擊。其重點在于數據的安全性。
- 身份認證是用來判斷某個身份的真實性,確認身份后,系統才可以依不同的身份給予不同的權限。其重點在于用戶的真實性。兩者的側重點是不同的。
2.2 公鑰和私鑰
- 在現代密碼體制中加密和解密是采用不同的密鑰(公開密鑰),也就是非對稱密鑰密碼系統,每個通信方均需要兩個密鑰,即公鑰和私鑰,這兩把密鑰可以互為加解密。
- 公鑰是公開的,不需要保密,而私鑰是由個人自己持有,并且必須妥善保管和注意保密。
2.3 公鑰私鑰的原則:
- 一個公鑰對應一個私鑰。
- 密鑰對中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰。
- 如果用其中一個密鑰加密數據,則只有對應的那個密鑰才可以解密。
- 如果用其中一個密鑰可以進行解密數據,則該數據必然是對應的那個密鑰進行的加密。
2.4 基于公開密鑰的加密&認證
2.4.1 基于公開密鑰的加密過程
場景1:比如有兩個用戶Alice和Bob,Alice想把一段明文通過雙鑰加密的技術發送給Bob,Bob有一對公鑰和私鑰,那么加密解密的過程如下:
- Bob將他的公開密鑰傳送給Alice。
- Alice用Bob的公開密鑰加密她的消息,然后傳送給Bob。
- Bob用他的私人密鑰解密Alice的消息。
2.4.2 基于公開密鑰的認證過程(驗簽)
身份認證和加密就不同了,主要用戶鑒別用戶的真偽。這里我們只要能夠鑒別一個用戶的私鑰是正確的,就可以鑒別這個用戶的真偽。
場景2:還是Alice和Bob這兩個用戶,Alice想讓Bob知道自己是真實的Alice,而不是假冒的,因此Alice只要使用公鑰密碼學對文件簽名發送給Bob,Bob使用Alice的公鑰對文件進行解密,如果可以解密成功,則證明Alice的私鑰是正確的,因而就完成了對Alice的身份鑒別。整個身份認證的過程如下:
- Alice用她的私人密鑰對文件加密,從而對文件簽名。
- Alice將簽名的文件傳送給Bob。
- Bob用Alice的公鑰解密文件,從而驗證簽名。
- Alice使用自己的私鑰加密,Bob用Alice的公鑰進行解密。
三 . 在App中是到底如何使用這些算法的?
3.1 我們公司的項目采用的是AES+RSA加密的方式進行加密的;
- 服務器生成并保存一對公鑰和私鑰,服務器將公鑰發給客戶端,客戶端用公鑰加密后將數據發給服務器,服務器用私鑰去解密。
- 客戶端也會生成一對公鑰和私鑰,在每次程序啟動配置的時候生成并保存在本地,公鑰隨著基本參數傳給服務器。
3.2 加密過程(iOS客戶端)
- AES加密生成AESkey,RSA加密生成一對密鑰對;
- 利用RSA算法將AESkey加密,然后數據用AESkey加密,將加密后AESkey值和加密后的數據一起傳給服務器。
- 服務器用私鑰解密出AESkey,在用AESkey解密出真實的信息。
3.3 補充
- 因為客戶端和服務器需要相互發送信息,都需要加密解密從對方傳來的數據,所以雙方都需要生成一對公鑰私鑰,服務器端的在客戶端第一次請求的時候會返回303公鑰失效的代碼,客戶端會重新請求,這次服務器會發送正確的公鑰,客戶端會保存下來這個公鑰。服務器端會定時生成新的公鑰私鑰。
- 在沒有private key的情況下,無法解密得到正確的數據,所以一定要注意private key的保存。
3.4 一對密鑰對的使用
公鑰加密,私鑰解密;
私鑰簽名,公鑰驗簽;
- 注:驗簽主要是為了驗證數據的來源的正確性,在沒有特殊的要求的時候,可以不做驗簽的工作。
從上圖可以看出一個對象可以擁有一個private key和多個public key。
部分內容取自:
http://www.lxweimin.com/p/422e97e60f2d
http://www.lxweimin.com/p/a2868b27675c
http://www.williamlong.info/archives/837.html