iOS散列和加密算法
安全性對(duì)于一個(gè)app來說是極為重要的梢为,比如說當(dāng)一個(gè)app服務(wù)端使用明文進(jìn)行密碼存儲(chǔ)的時(shí)候轰坊,一旦用戶密碼泄露,對(duì)于用戶來說影響是極其大的肴沫,可能用戶的這個(gè)密碼在前提的平臺(tái)也在使用。所以在開發(fā)中我們需要對(duì)一些重要的信息比如用戶隱私進(jìn)行加密悲幅。
總的來說站蝠,在安全性上,我們可以從幾個(gè)方面入手:
- app代碼層面上的安全郁副。
- 比如說代碼混淆豌习,代碼加密或者加殼拔疚,增加被逆向的難度既荚。
- 網(wǎng)絡(luò)傳輸前后的安全
- 盡量使用https而不是http。
- 無論是get還是post請(qǐng)求句各,可以理解為都是在明文傳輸晴叨。所以請(qǐng)求和響應(yīng)都可以進(jìn)行加密和簽名處理。
- 數(shù)據(jù)存儲(chǔ)的安全兼蕊。
- 密碼或者其他重要信息不要在服務(wù)端或者app內(nèi)明文存儲(chǔ),而應(yīng)該是使用這些信息的哈希值或者加密哈希值后再進(jìn)行存儲(chǔ)产禾。
幾種常見的散列和加密算法
一. 哈希(散列)算法
- 散列就是對(duì)數(shù)據(jù)信息的摘要牵啦,提煉。
- 散列結(jié)果不可逆楞件,這保證了無法通過散列的結(jié)果推導(dǎo)出原文僧著。
- 無論是什么數(shù)據(jù),散列后的結(jié)果長度是一樣的,比如MD5運(yùn)算后得到的都是128bit站故。
- 對(duì)于相同的數(shù)據(jù)散列后的結(jié)果是一樣的,這保證了“唯一性”。
- 對(duì)于不同的數(shù)據(jù)散列后的結(jié)果是不同的愈腾。存在相同的可能性岂津,但概率不大,因?yàn)閿?shù)據(jù)是有無限的,而散列結(jié)果長度是固定的橱乱,這樣導(dǎo)致肯定會(huì)存在不同數(shù)據(jù)對(duì)應(yīng)同樣散列結(jié)果的可能,但基本可以忽略不計(jì)。
- 數(shù)據(jù)隨便一點(diǎn)點(diǎn)的改動(dòng)作瞄,散列的結(jié)果變化會(huì)很大危纫。
所以散列可以用來做數(shù)據(jù)簽名,或者說唯一性的標(biāo)識(shí)种蝶。
- MD5
Message Digest Algorithm MD5(中文名為消息摘要算法第五版)
輸出:128bit螃征。
因?yàn)镸D5已經(jīng)被破解,所以不再推薦在重要場合使用会傲。而且已經(jīng)存在對(duì)MD5進(jìn)行窮舉的網(wǎng)站。
加鹽:就是在原信息的基礎(chǔ)上裸燎,加入一段字符串泼疑,再進(jìn)行散列運(yùn)算。
這樣的做法移稳,可以在原來簡單MD5的基礎(chǔ)上会油,加大一些被窮舉出原文的難度。所以相對(duì)直接MD5,安全性會(huì)稍微高一點(diǎn)點(diǎn)都许。
但是也會(huì)存在問題嫂冻,一旦鹽泄漏,也就是加入的那段字符串泄漏桨仿,窮舉出來的可能性就會(huì)變大。
蘋果本身也不推薦我們再使用md5了钱雷,推薦我們?nèi)ナ褂肧HA256或者強(qiáng)度更高的。
- SHA1/256/512
SHA1: 安全哈希算法(Secure Hash Algorithm)
輸出: 160bit
SHA256:
輸出:256bit
SHA512:
輸出:512bit - HMac
HMac和MD5非常相似的从铲,只不過在MD5的基礎(chǔ)上澄暮,多了鹽。
可以理解成:本來加鹽md5(message + salt)這個(gè)操作鹽是固定寫死在本地的伸辟,而HMAC中salt是動(dòng)態(tài)從服務(wù)端獲取的馍刮,然后再進(jìn)行兩次散列。這樣黑客就不容易猜出salt静稻,也增加了破解原文的難度匈辱。
Hmac算法針對(duì)所有哈希算法都通用,無論是MD5還是SHA-1押搪。采用HMAC替代我們自己的salt算法浅碾,可以使程序算法更標(biāo)準(zhǔn)化,也更安全厦画。
用途:
- 消息摘要
有些地方是不能進(jìn)行明文存儲(chǔ)的埂陆,比如用戶密碼等,這時(shí)候就可以使用密碼的哈希值或者加密哈希值后再去進(jìn)行存儲(chǔ)焚虱。 - 數(shù)字簽名
比如在在通信請(qǐng)求中懂版,我們對(duì)請(qǐng)求和響應(yīng)數(shù)據(jù)進(jìn)行散列得到散列信息,然后使用RSA進(jìn)行散列信息的加密。因?yàn)槊罔€只有服務(wù)端有薇芝,服務(wù)端拿到RSA加密的散列信息后驗(yàn)簽丰嘉,就能知道數(shù)據(jù)是否完整,有沒有被篡改過等等耍贾。 - 查找
因?yàn)楣5摹拔ㄒ恍浴甭沸遥钥梢阅脕懋?dāng)做數(shù)據(jù)的身份證,指紋晃听。比如通過直接對(duì)比兩個(gè)文件的哈希值砰识,就可以知道這兩個(gè)文件是不是同一個(gè)文件。 - 版權(quán)
也是因?yàn)椤拔ㄒ恍浴背醢撸热缒惆l(fā)布了個(gè)視頻或者文章予借,別人拿了你的視頻文章也去發(fā)布,這里就會(huì)有盜版的問題秦叛,怎么區(qū)分正版瀑粥,就是通過哈希,你先發(fā)布的狞换,所以系統(tǒng)會(huì)記錄你之前發(fā)布的視頻哈希值修噪,一比較如果兩哈希值一樣,說明后者存在盜版的問題黄琼。
二. 對(duì)稱加密
對(duì)稱加密只有一個(gè)秘鑰,明文通過秘鑰加密獲得密文;密文通過秘鑰解密獲得明文围苫。
1. DES
數(shù)據(jù)加密標(biāo)準(zhǔn),現(xiàn)在用的很少了拧揽,加密強(qiáng)度不夠腺占。
2. 3DES
使用3個(gè)秘鑰,對(duì)數(shù)據(jù)進(jìn)行3次加密饮怯,強(qiáng)度增加了嚎研,但秘鑰的存儲(chǔ)難度大大加大了。
3. AES
高級(jí)加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard论矾,縮寫:AES)杆勇,在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)蚜退。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES钻注,已經(jīng)被多方分析且廣為全世界所使用。
優(yōu)點(diǎn):加密解密速度快幅恋,適用于數(shù)據(jù)量大的場景捆交。
缺點(diǎn):秘鑰的傳輸與存儲(chǔ),一旦秘鑰泄漏品追,加密也就暴露了肉瓦。
所以一般秘鑰用RSA來加密傳輸银还。比如iOS中鑰匙串的訪問就是AES洁墙。
AES的話有五種加密模式
1.電碼本模式(Electronic Codebook Book (ECB)
2.密碼分組鏈接模式(Cipher Block Chaining (CBC))
3.計(jì)算器模式(Counter (CTR))
4.密碼反饋模式(Cipher FeedBack (CFB))
5.輸出反饋模式(Output FeedBack (OFB))
常用的是:
電話本模式(ECB)
會(huì)把數(shù)據(jù)分成幾塊,每一塊獨(dú)立加密戒财。
比如說我改了第三塊的一點(diǎn)點(diǎn)數(shù)據(jù)热监,那么ECB加密模式下,修改前前面兩塊的加密結(jié)果和修改后前面兩塊的加密結(jié)果是一樣的饮寞。只有第三塊因?yàn)閿?shù)據(jù)的修改導(dǎo)致加密的不同孝扛。
密碼分組鏈接模式(CBC)
同樣會(huì)把數(shù)據(jù)分成幾塊,但每塊存在依賴關(guān)系幽崩,比如第二塊的加密依賴于第一塊數(shù)據(jù)苦始,第三塊依賴于第二塊;
解密也存在依賴關(guān)系慌申,第二塊解密依賴于第一塊數(shù)據(jù)陌选,第三塊依賴于第二塊蹄溉。
這樣的做法咨油,保證了數(shù)據(jù)的完整性,只要一塊有問題柒爵,那么就說明數(shù)據(jù)被篡改過役电。
有一點(diǎn)要注意的是,如果是直接調(diào)用系統(tǒng)的庫進(jìn)行非對(duì)稱加密的話棉胀,最好是在函數(shù)調(diào)用前法瑟,做一些自己的加密或者混淆,否則因?yàn)槭窍到y(tǒng)的庫函數(shù)沒辦法去符號(hào)化的唁奢,很容易被逆向逮到加密前的參數(shù)霎挟。
三. 非對(duì)稱加密
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊驮瞧,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)氓扛。
RSA算法基于一個(gè)十分簡單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難论笔,因此可以將乘積公開作為加密公鑰采郎,只要兩個(gè)質(zhì)數(shù)足夠大,破解的可能性就足夠小狂魔。至少在現(xiàn)階段是沒可能因式分解出來的蒜埋。所以RSA私鑰一般是1024位,在重要場合可能是2048位最楷。
非對(duì)稱加密整份,公鑰加密待错,私鑰解密,速度相對(duì)較慢烈评,適用于數(shù)據(jù)量小的場景火俄。
比如說支付寶,使用AES對(duì)請(qǐng)求和響應(yīng)內(nèi)容進(jìn)行加密讲冠,防止內(nèi)容的泄漏瓜客。使用RSA進(jìn)行加密內(nèi)容的簽名,兩端分別加簽驗(yàn)簽竿开,防止數(shù)據(jù)的篡改谱仪。
RSA具體實(shí)現(xiàn)原理可以看一下這個(gè)博客:RSA算法原理一,RSA算法原理二
最后否彩,這里是一些和加密相關(guān)的demo和工具疯攒。