淺談android數據存儲加密

寫在開頭

CSDN:http://blog.csdn.net/say_from_wenjava

掘金:https://juejin.im/user/59b09eb2518825241e2255eaandroid

在移動端的開發中,數據安全的問題一直是你們備受關注的,數據加密技術也受到了你們的青睞。項目中也用到了一些,在這裏學習總結下,完善下本身的知識,也分享給你們,一塊兒交流!(末尾也會說下本身在項目中的使用)算法

按可逆性:加密可分爲可逆算法不可逆算法數組

按對稱性:加密可分爲對稱算法非對稱算法安全

通常的加密分爲如下幾種,下面會分別簡單講解原理和其使用方法:服務器

Base64編碼算法 (可逆)-MD5加密  (不可逆)(還有一個sha1值,可能作過支付寶的會比較熟悉)網絡

-Des加密  (對稱,可逆)-Aes加密  (對稱,可逆)分佈式

-Rsa加密(非對稱,可逆)學習

淺談對稱非對稱

對稱

對稱加密算法是較傳統的加密體制,即通訊雙方在加/解密過程當中使用他們共享的單一密鑰,鑑於其算法簡單加密速度快的優勢,目前仍然在使用,可是安全性方面就差一點可能。最經常使用的對稱密碼算法是DES算法,而DES密鑰長度較短,已經不適合當今分佈式開放網絡對數據加密安全性的要求。一種新的基於Rijndael算法(本身腦補,本人也不太熟悉)對稱高級數據加密標準AES取代了數據加密標準DES,彌補了DES的缺陷,目前使用比較多一點。網站

非對稱

非對稱加密因爲加/解密鑰不一樣(公鑰加密,私鑰解密),密鑰管理簡單,獲得了很普遍的應用。RSA是非對稱加密系統最著名的公鑰密碼算法。可是因爲RSA算法進行的都是大數計算,使得RSA最快的狀況也比AES慢上倍,這是RSA最大的缺陷。可是其安全性較高,這也是你們比較喜歡的地方吧!

算法講解及使用

Base64算法

Base64其實並非安全領域的加密算法,由於它的加密解密算法都是公開的,典型的防菜鳥不防程序猿的例子哈哈,Base64編碼本質上是一種將二進制數據轉成文本數據的方案。用處就是將一些不適合傳輸的數據內容進行編碼來適合傳輸

字符串進行Base64編碼

String encodedString = Base64.encodeToString("wenwen".getBytes(), Base64.DEFAULT);

第一個參數就是字節數組

字符串進行Base64解碼

String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT));

decodedString 就是wenwen

MD5算法

它是一種單向加密算法,只能加密、沒法解密。多用於密碼的存儲等等。對於MD5的安全性,網上有關MD5解密的網站數不勝數,破解機制採用窮舉法,就是手機全部可能的MD5值跑字典。因此經常採用對數據進行屢次MD5加密或者採起加鹽(就是加一段獨有的字符串在進行加密)的操做。

使用:

 

對稱加密(這裏只說下應用普遍的AES)

對稱加密祕鑰是惟一的,加密解密都是一個祕鑰。AES速度上佔優於RSA,可是隻有一個祕鑰,安全性較低一些。

使用:

 

 

 

RSA加密

RSA算法是最流行的公鑰密碼算法,使用長度能夠變化的密鑰。RSA是第一個既能用於數據加密也能用於數字簽名的算法。它在不少密碼協議中都有應用,如SSL和S/MIME。RSA算法是基於大質數的因數分解的公匙體系。簡單的講,就是兩個很大的質數,一個做爲公鑰,另外一個做爲私鑰,如用其中一個加密,則用另外一個解密。密鑰長度從40到2048位可變,密鑰越長,加密效果越好,但加密解密的開銷也大。因此他在加密的速度上回小於AES等對稱加密。

使用:

 

 

 

RSA所遇問題

關於加密填充方式:以前覺得上面這些操做就能實現rsa加解密,覺得萬事大吉了,呵呵,這事還沒完,悲劇仍是發生了,Android這邊加密過的數據,服務器端死活解密不了,原來android系統的RSA實現是"RSA/None/NoPadding",而標準JDK實現是"RSA/None/PKCS1Padding" ,這形成了在android機上加密後沒法在服務器上解密的緣由,因此在實現的時候這個必定要注意。

實現分段加密:搞定了填充方式以後又自信的認爲萬事大吉了,但是意外仍是發生了,RSA非對稱加密內容長度有限制,1024位key的最多隻能加密127位數據,不然就會報錯(javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes) , RSA 是經常使用的非對稱加密算法。最近使用時卻出現了「不正確的長度」的異常,研究發現是因爲待加密的數據超長所致。RSA 算法規定:待加密的字節數不能超過密鑰的長度值除以 8 再減去 11(即:KeySize / 8 - 11),而加密後獲得密文的字節數,正好是密鑰的長度值除以 8(即:KeySize / 8)。

分段公鑰加密私鑰加密

 

 

 

請接着下圖看!!

分段私鑰加密公鑰加密

 

仍是要請你接着下圖看一下

項目中使用

在實際開發中,不是過重要的數據用一種加密方式感受就能夠了。可是比較重要的數據建議用多種加密方式結合的方式,好比我用的RSA+AES加密。

他主要解決了兩個問題:

1.RSA加解密速度慢,不適合大量數據文件加密 

2.AES加密速度很快,可是安全性沒有RSA加密方式的安全。

其主要思想就是服務端生成公鑰私鑰,並提供接口將公鑰給android端,android端生成AES祕鑰,並用AES祕鑰對大量數據進行加密(解決RSA加解密速度慢的問題),而後用調用接口拿到的RSA公鑰對本身生成AES祕鑰進行加密,客戶端將獲得的祕鑰和經過AES加密的數據發送給服務器。(祕鑰能夠放在請求頭中,數據放在請求體中,這個隨意了)。服務拿到你的祕鑰和數據後,用私鑰加密獲得AES祕鑰,再經過祕鑰獲得發送的數據就行了。

感謝教我學習的大神

此次的學習也是學習的其餘大神的總結,很是感謝他們,在這裏記錄下來,供本身學習也想讓更多的人看到,幫助更多的人。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/李總寫代碼

做者:say_from_wen 連接:https://www.jianshu.com/p/4f4a927339a9 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索