iOS開發中常用到的加密方式

1 base64


1.1 簡介


Base64編碼的思想是是採用64個基本的ASCII碼字符對數據進行重新編碼。它將需要編碼的數據拆分成字節數組。以3個字節爲一組。按順序排列24位數據,再把這24位數據分成4組,即每組6位。再在每組的的最高位前補兩個0湊足一個字節。這樣就把一個3字節爲一組的數據重新編碼成了4個字節。當所要編碼的數據的字節數不是3的整倍數,也就是說在分組時最後一組不夠3個字節。這時在最後一組填充1到2個0字節。並在最後編碼完成後在結尾添加1到2個“=”。例:將對ABC進行BASE64編碼首先取ABC對應的ASCII碼值。A(65)B(66)C(67)。再取二進制值A(01000001)B(01000010)C(01000011),然後把這三個字節的二進制碼接起來(010000010100001001000011),再以6位爲單位分成4個數據塊並在最高位填充兩個0後形成4個字節的編碼後的值(00010000)(00010100)(00001001)(00000011)。藍色部分爲真實數據。再把這四個字節數據轉化成10進制數得(16)(20)(19)(3)。最後根據BASE64給出的64個基本字符表,查出對應的ASCII碼字符(Q)(U)(J)(D)。這裏的值實際就是數據在字符表中的索引。


注:BASE64字符表:包括大寫 A-Z 小寫 a-z 數字 0-9 和+ /


解碼過程就是把4個字節再還原成3個字節再根據不同的數據形式把字節數組重新整理成數據.


1.2 base64的加密原則


base64加密原則: 6 bit(原8bit) 一個字節. 不足的位數 用0 補齊.兩個0 用一個 = 表示.


1.3 加密特點:數據加密之後,數據量會變大,變大 1/3 左右.


1.4 使用步驟


加密:


1> 將要加密的數據轉爲二進制的 data


2> [data base64EncodedDataWithOptions:0] 加密成二進制數據


[data base64EncodedStringWithOptions:0] 加密成字符串數據


3> 寫入文件


解密:


1>    將要解密的文件轉爲二進制數據


[str dataUsingEncoding:NSUTF8StringEncoding] //是字符串


2>    [[NSData alloc] initWithBase64EncodedData:data options:0];


 [[NSData alloc] initWithBase64EncodedString:…]


3>    寫入文件


2 MD5


2.1 MD5簡介


MD5的全稱是Message-DigestAlgorithm 5,Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。請注意我使用了"字節串"而不是"字符串"這個詞,是因爲這種變換隻與字節的值有關,與字符集或編碼方式無關。 MD5將任意長度的"字節串"變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因爲原始的字符串有無窮多個,這有點象不存在反函數的數學函數。


MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被"篡改"。舉個例子,你將一段話寫在一個叫readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的"抵賴",這就是所謂的數字簽名應用。


MD5還廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,而系統並不"知道"用戶的密碼是什麼。


注: MD5加密是不可逆的,也就是說, MD5加密後是不能解密的,所謂的解密只是用大數據的”試用”,來測出結果的.


2.2 加密方式


    NSString *password = @"zhang";


    password = [password md5String];


注:單純的 MD5加密是不安全的,因此要用到 MD5加鹽的方式


2.3 MD5加鹽


> 鹽值:MD5加鹽的值,加的鹽值越高越好.(鹽值可以隨意添加)


> 試用步驟:


1> 生成鹽值


NSString *salt = @”鹽值”;


2> 拼接鹽值


password = [password stringByAppendingString:salt];


3> 加密


password = password.md5String;


2.3 時間戳/動態密碼


1> 實現目標


用戶的密碼是一定的,但是每次發送給網絡的密碼都不同.相同的密碼相同的加密算法,每次獲得的值不同.客戶端和服務器端的時間是相同的.


2> 原理


客戶端和服務器端依時間爲基準採用相同的加密算法


3> 實現細節


客戶端和服務器端要求時間一致

時間精度越高,越安全

客戶端:發送網絡請求的時候依當前時間爲基準進行加密.

服務器端:以接收到時間爲基準進行加密.還要以接收到的時間的前一分鐘時間爲基準進行加密.

服務器端:判斷這兩次的密碼和客戶端發送的密碼是否一致.

4> 實現步驟


第一次hmac 加密

   password = [password hmacMD5StringWithKey:hmacKey];


將加密後的值和時間進行拼接

password = [password stringByAppendingString:timer];


第二次加密

password = [password hmacMD5StringWithKey:hmacKey];


 


補充:


DES


DES是Data Encryption Standard(數據加密標準)的縮寫。DES是一個分組加密算法,他以64位爲分組對數據加密。同時DES也是一個對稱算法:加密和解密用的是同一個算法。它的密匙長度是56位(因爲每個第8位都用作奇偶校驗),密匙可以是任意的56位的數,而且可以任意時候改變。其中有極少量的數被認爲是弱密匙,但是很容易避開他們。所以保密性依賴於密鑰。


DES對64(bit)位的明文分組M進行操作,M經過一個初始置換IP置換成m0,將m0明文分成左半部分和右半部分m0=(L0,R0),各32位長。然後進行16輪完全相同的運算,這些運算被稱爲函數f,在運算過程中數據與密匙結合。經過16輪後,左,右半部分合在一起經過一個末置換,這樣就完成了。在每一輪中,密匙位移位,然後再從密匙的56位中選出48位。通過一個擴展置換將數據的右半部分擴展成48位,並通過一個異或操作替代成新的32位數據,在將其置換換一次。這四步運算構成了函數f。然後,通過另一個異或運算,函數f的輸出與左半部分結合,其結果成爲新的右半部分,原來的右半部分成爲新的左半部分。將該操作重複16次,就實現了。


解密過程:在經過所有的代替、置換、異或盒循環之後,你也許認爲解密算法與加密算法完全不同。恰恰相反,經過精心選擇的各種操作,獲得了一個非常有用的性質:加密和解密使用相同的算法。DES加密和解密唯一的不同是密匙的次序相反。如果各輪加密密匙分別是K1,K2,K3….K16那麼解密密匙就是K16,K15,K14…K1。


 


鑰匙串存儲--SSKeychain 第三方框架


> 鑰匙串:可以在鑰匙串中直接寫入明文密碼,鑰匙串比較安全


鑰匙串的存儲


1>    要寫入的密碼


 NSString *password = @"zhang";


2>    取出應用的唯一標示符


NSString *bundleID = [NSBundle mainBundle].bundleIdentifier;


3>   寫入


[SSKeychain setPassword:password forService:bundleID account:kUserNameKey]


鑰匙串的讀取:


根據鑰匙串的唯一標示符取出密碼

NSString *password = [SSKeychain passwordForService:bundleID account:kUserNameKey];



Cookie


是一個網絡信息塊,用來存儲信息

cookie 會自動登錄,會將 cookie 中保存的數據自動發給服務器

查看 cookie 中信息:注: NSHTTPCookieStorage中保存了cookie 的所有信息

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];


取出storage 中的cookie 信息

[storage.cookies enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {        

        NSHTTPCookie *cookie = obj;

        NSLog(@"cookie:%@",cookie);

    }];

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章