寫在開頭
CSDN:http://blog.csdn.net/say_from_wen
掘金:https://juejin.im/user/59b09eb2518825241e2255ea
在移動(dòng)端的開發(fā)中,數(shù)據(jù)安全的問(wèn)題一直是大家備受關(guān)注的,數(shù)據(jù)加密技術(shù)也受到了大家的青睞祟敛。項(xiàng)目中也用到了一些处渣,在這里學(xué)習(xí)總結(jié)下球散,完善下自己的知識(shí)蒜胖,也分享給大家环葵,一起交流B住(末尾也會(huì)說(shuō)下自己在項(xiàng)目中的使用)
按可逆性:加密可分為可逆算法和不可逆算法
按對(duì)稱性:加密可分為對(duì)稱算法和非對(duì)稱算法
一般的加密分為以下幾種嗜愈,下面會(huì)分別簡(jiǎn)單講解原理和其使用方法:
Base64編碼算法 (可逆)-MD5加密? (不可逆)(還有一個(gè)sha1值,可能做過(guò)支付寶的會(huì)比較熟悉)
-Des加密? (對(duì)稱莽龟,可逆)-Aes加密? (對(duì)稱蠕嫁,可逆)
-Rsa加密(非對(duì)稱,可逆)
淺談對(duì)稱非對(duì)稱
對(duì)稱
對(duì)稱加密算法是較傳統(tǒng)的加密體制毯盈,即通信雙方在加/解密過(guò)程中使用他們共享的單一密鑰剃毒,鑒于其算法簡(jiǎn)單和加密速度快的優(yōu)點(diǎn),目前仍然在使用,但是安全性方面就差一點(diǎn)可能赘阀。最常用的對(duì)稱密碼算法是DES算法益缠,而DES密鑰長(zhǎng)度較短,已經(jīng)不適合當(dāng)今分布式開放網(wǎng)絡(luò)對(duì)數(shù)據(jù)加密安全性的要求基公。一種新的基于Rijndael算法(自己腦補(bǔ)幅慌,本人也不太熟悉)對(duì)稱高級(jí)數(shù)據(jù)加密標(biāo)準(zhǔn)AES取代了數(shù)據(jù)加密標(biāo)準(zhǔn)DES,彌補(bǔ)了DES的缺陷轰豆,目前使用比較多一點(diǎn)胰伍。
非對(duì)稱
非對(duì)稱加密由于加/解密鑰不同(公鑰加密,私鑰解密)酸休,密鑰管理簡(jiǎn)單骂租,得到了很廣泛的應(yīng)用。RSA是非對(duì)稱加密系統(tǒng)最著名的公鑰密碼算法斑司。但是由于RSA算法進(jìn)行的都是大數(shù)計(jì)算渗饮,使得RSA最快的情況也比AES慢上倍,這是RSA最大的缺陷陡厘。但是其安全性較高抽米,這也是大家比較喜歡的地方吧!
算法講解及使用
Base64算法
Base64其實(shí)并不是安全領(lǐng)域的加密算法糙置,因?yàn)樗募用芙饷芩惴ǘ际枪_的,典型的防菜鳥不防程序猿的例子哈哈是目,Base64編碼本質(zhì)上是一種將二進(jìn)制數(shù)據(jù)轉(zhuǎn)成文本數(shù)據(jù)的方案谤饭。用處就是將一些不適合傳輸?shù)臄?shù)據(jù)內(nèi)容進(jìn)行編碼來(lái)適合傳輸。
字符串進(jìn)行Base64編碼
String encodedString = Base64.encodeToString("wenwen".getBytes(), Base64.DEFAULT);
第一個(gè)參數(shù)就是字節(jié)數(shù)組
字符串進(jìn)行Base64解碼
String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT));
decodedString 就是wenwen
MD5算法
它是一種單向加密算法懊纳,只能加密揉抵、無(wú)法解密。多用于密碼的存儲(chǔ)等等嗤疯。對(duì)于MD5的安全性冤今,網(wǎng)上有關(guān)MD5解密的網(wǎng)站數(shù)不勝數(shù),破解機(jī)制采用窮舉法茂缚,就是手機(jī)所有可能的MD5值跑字典戏罢。所以常常采用對(duì)數(shù)據(jù)進(jìn)行多次MD5加密或者采取加鹽(就是加一段獨(dú)有的字符串在進(jìn)行加密)的操作。
使用:
對(duì)稱加密(這里只說(shuō)下應(yīng)用廣泛的AES)
對(duì)稱加密秘鑰是唯一的脚囊,加密解密都是一個(gè)秘鑰龟糕。AES速度上占優(yōu)于RSA,但是只有一個(gè)秘鑰悔耘,安全性較低一些讲岁。
使用:
RSA加密
RSA算法是最流行的公鑰密碼算法,使用長(zhǎng)度可以變化的密鑰。RSA是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法缓艳。它在很多密碼協(xié)議中都有應(yīng)用校摩,如SSL和S/MIME。RSA算法是基于大質(zhì)數(shù)的因數(shù)分解的公匙體系阶淘。簡(jiǎn)單的講衙吩,就是兩個(gè)很大的質(zhì)數(shù),一個(gè)作為公鑰舶治,另一個(gè)作為私鑰分井,如用其中一個(gè)加密,則用另一個(gè)解密霉猛。密鑰長(zhǎng)度從40到2048位可變尺锚,密鑰越長(zhǎng),加密效果越好惜浅,但加密解密的開銷也大瘫辩。所以他在加密的速度上回小于AES等對(duì)稱加密。
使用:
RSA所遇問(wèn)題
關(guān)于加密填充方式:之前以為上面這些操作就能實(shí)現(xiàn)rsa加解密坛悉,以為萬(wàn)事大吉了伐厌,呵呵,這事還沒(méi)完裸影,悲劇還是發(fā)生了挣轨,Android這邊加密過(guò)的數(shù)據(jù),服務(wù)器端死活解密不了轩猩,原來(lái)android系統(tǒng)的RSA實(shí)現(xiàn)是"RSA/None/NoPadding"卷扮,而標(biāo)準(zhǔn)JDK實(shí)現(xiàn)是"RSA/None/PKCS1Padding" ,這造成了在android機(jī)上加密后無(wú)法在服務(wù)器上解密的原因均践,所以在實(shí)現(xiàn)的時(shí)候這個(gè)一定要注意晤锹。
實(shí)現(xiàn)分段加密:搞定了填充方式之后又自信的認(rèn)為萬(wàn)事大吉了,可是意外還是發(fā)生了彤委,RSA非對(duì)稱加密內(nèi)容長(zhǎng)度有限制鞭铆,1024位key的最多只能加密127位數(shù)據(jù),否則就會(huì)報(bào)錯(cuò)(javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes) 焦影, RSA 是常用的非對(duì)稱加密算法车遂。最近使用時(shí)卻出現(xiàn)了“不正確的長(zhǎng)度”的異常,研究發(fā)現(xiàn)是由于待加密的數(shù)據(jù)超長(zhǎng)所致偷办。RSA 算法規(guī)定:待加密的字節(jié)數(shù)不能超過(guò)密鑰的長(zhǎng)度值除以 8 再減去 11(即:KeySize / 8 - 11)艰额,而加密后得到密文的字節(jié)數(shù),正好是密鑰的長(zhǎng)度值除以 8(即:KeySize / 8)椒涯。
分段公鑰加密私鑰加密
請(qǐng)接著下圖看1凇!
分段私鑰加密公鑰加密
還是要請(qǐng)你接著下圖看一下
項(xiàng)目中使用
在實(shí)際開發(fā)中,不是太重要的數(shù)據(jù)用一種加密方式感覺(jué)就可以了祖搓。但是比較重要的數(shù)據(jù)建議用多種加密方式結(jié)合的方式狱意,比如我用的RSA+AES加密。
他主要解決了兩個(gè)問(wèn)題:
1.RSA加解密速度慢拯欧,不適合大量數(shù)據(jù)文件加密
2.AES加密速度很快详囤,但是安全性沒(méi)有RSA加密方式的安全。
其主要思想就是服務(wù)端生成公鑰私鑰镐作,并提供接口將公鑰給android端藏姐,android端生成AES秘鑰,并用AES秘鑰對(duì)大量數(shù)據(jù)進(jìn)行加密(解決RSA加解密速度慢的問(wèn)題)该贾,然后用調(diào)用接口拿到的RSA公鑰對(duì)自己生成AES秘鑰進(jìn)行加密羔杨,客戶端將得到的秘鑰和通過(guò)AES加密的數(shù)據(jù)發(fā)送給服務(wù)器。(秘鑰可以放在請(qǐng)求頭中杨蛋,數(shù)據(jù)放在請(qǐng)求體中兜材,這個(gè)隨意了)。服務(wù)拿到你的秘鑰和數(shù)據(jù)后逞力,用私鑰加密得到AES秘鑰曙寡,再通過(guò)秘鑰得到發(fā)送的數(shù)據(jù)就好了。
感謝教我學(xué)習(xí)的大神
這次的學(xué)習(xí)也是學(xué)習(xí)的其他大神的總結(jié)寇荧,非常感謝他們举庶,在這里記錄下來(lái),供自己學(xué)習(xí)也想讓更多的人看到揩抡,幫助更多的人灯变。http://blog.csdn.net/randyjiawenjie/article/details/6587986http://blog.csdn.net/axi295309066/article/details/52491077http://blog.csdn.net/qq_26685493/gongyongfeng的博客http://www.cnblogs.com/whoislcj/李總寫代碼