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

2021-12-29 16:39:21 字數 4403 閱讀 9502

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 的所有資訊

取出storage 中的cookie 資訊

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

1 base64 1.1 簡介 base64編碼的思想是是採用64個基本的ascii碼字元對資料進行重新編碼。它將需要編碼的資料拆分成位元組陣列。以3個位元組為一組。按順序排列24位資料,再把這24位資料分成4組,即每組6位。再在每組的的最高位前補兩個0湊足乙個位元組。這樣就把乙個3位元組為一組的資...

開發常用到的幾種加密方式

有時候我們經常會聽到一些加密方式 最常見的就是base64和md5 這裡分享一下平時看到的介紹和心得 1.base64 編碼的思想是是採用64個基本的ascii碼字元對資料進行重新編碼。它將需要編碼的資料拆分成位元組陣列。以3個位元組為一組。按順序排列24位資料,再把這24位資料分成4組,即每組6位...

iOS開發中常用到的巨集定義

字串是否為空 define kstringisempty str str iskindofclass nsnull class str nil str length 1 yes no 陣列是否為空 define karrayisempty array array nil array iskindof...