Android中常用加密算法及運用示例

介紹

加密是保障信息安全的一個組成部分,現在說的加密是一個寬泛的概念,包括解密。

定義:

是以某種特殊的算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法瞭解信息的內容。

加密方式的分類:

  • 對稱加密算法: 加密和解密密鑰相同,例如,DES、3DES、AES
  • 非對稱加密算法 (公鑰、私鑰):加密和解密密鑰不同,但是是一對,例如RSA、ECC
  • 摘要算法 :變長變定長,不能還原,MD5、SHA、CRC

對稱加密算法

DES:全稱爲 Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1976 年被美國聯邦政府的國家標準局確定爲聯邦資料處理標準(FIPS),隨後在國際上廣泛流傳開來。

3DES:也叫 Triple DES,是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當於是對每個數據塊應用三次 DES 加密算法。由於計算機運算能力的增強,原版 DES 密碼的密鑰長度變得容易被暴力破解;3DES 即是設計用來提供一種相對簡單的方法,即通過增加 DES 的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼算法。

AES: 高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱 Rijndael 加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的 DES,已經被多方分析且廣爲全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)於 2001 年 11 月26 日發佈於 FIPS PUB 197,並在 2002 年 5 月 26 日成爲有效的標準。AES 算法加密強度大,執行效率高,使用簡單,實際開發中建議選擇 AES 算法。

拓展:Base64 編碼加密後的結果(Base64不是加密算法)

加密後的結果是字節數組,這些被加密後的字節在碼錶(例如 UTF-8 碼錶)上找不到對應字符,會出現亂碼,當亂碼字符串再次轉換爲字節數組時,長度會變化,導致解密失敗,所以轉換後的數據是不安全的。使用 Base64 對字節數組進行編碼,任何字節都能映射成對應的 Base64 字符,之後能恢復到字節數組,利於加密後數據的保存於傳輸,所以轉換是安全的。同樣,字節數組轉換成 16 進制字符串也是安全的

實際 android 開發中可以用對稱加密(例如選擇 AES 算法)來解決很多問題,例如:

   1,做一個管理密碼的 app,我們在不同的網站裏使用不同賬號密碼,很難記住,想做個 app 統一管理,但是賬號密碼保存在手機裏,一旦丟失了容易造成安全隱患,所以需要一種加密算法,將賬號密碼信息加密起來保管,這時候如果使用對稱加密算法,將數據進行加密,祕鑰我們自己記載心裏,只需要記住一個密碼。需要的時候可以還原信息。
   2,android 裏需要把一些敏感數據保存到 SharedPrefrence 裏的時候,也可以使用對稱加密,這樣可以在需要的時候還原。
   3,請求網絡接口的時候,我們需要上傳一些敏感數據,同樣也可以使用對稱加密,服務端使用同樣的算法就可以解密。或者服務端需要給客戶端傳遞數據,同樣也可以先加密,然後客戶端使用同樣算法解密。

非對稱加密算法

與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公鑰(publickey)和(privatekey)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密;如果用私鑰對數據進行加密,那麼只有用對應的公鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。簡單理解爲:加密和解密是不同的鑰匙

非對稱加密用途:

1,身份認證一條加密信息若能用 A 的公鑰能解開,則該信息一定是用 A 的私鑰加密的,該能確定該用戶是 A。
2,陌生人通信:A 和 B 兩個人互不認識,A 把自己的公鑰發給 B,B 也把自己的公鑰發給 A,則雙方可以通過對方的公鑰加密信息通信。C 雖然也能得到 A、B 的公鑰,但是他解不開密文

非對稱加密一般不會單獨拿來使用,他並不是爲了取代對稱加密而出現的,非對稱加密速度比對稱加密慢很多,極端情況下會慢 1000 倍,所以一般不會用來加密大量數據,通常我們經常會將對稱加密和非對稱加密兩種技術聯合起來使用,例如用非對稱加密來給稱加密裏的祕鑰進行加密(即祕鑰交換)

消息摘要

使用場景:
1. 對用戶密碼進行 md5 加密後保存到數據庫裏
2. 軟件下載站使用消息摘要計算文件指紋,防止被篡改
3. 數字簽名

MessageDigest digest = MessageDigest.getInstance(“MD5”);
byte[] result = digest.digest(content.getBytes());
//消息摘要的結果一般都是轉換成 16 進制字符串形式展示
String hex = Hex.encode(result);
//MD5 結果爲 16 字節(128 個比特位)、轉換爲 16 進製表示後長度是 32 個字符
//SHA 結果爲 20 字節(160 個比特位)、轉換爲 16 進製表示後長度是 40 個字符

消息摘要後的結果是固定長度,無論你的數據有多大,哪怕是隻有一個字節或者是一個 G 的文件,摘要後的結果都是固定長度

經常聽到有人問這樣的問題,MD5 摘要後結果到底是多少位?有的人說是 16 位,有的說是 128 位,有的說是 32 位。到底是多長,這個時候我們就要明白,16 位指的是字節位數,128 位指的是比特位,32 位指的結果轉換成 16 進制展示的字符位數。

數字簽名

數字簽名是非對稱加密與數字摘要的組合應用應用場景:

  1. 校驗用戶身份(使用私鑰簽名,公鑰校驗,只要用公鑰能校驗通過,則該信息一定是私鑰持有者發佈的)
  2. 校驗數據的完整性(用解密後的消息摘要跟原文的消息摘要進行對比)

數字證書

數字證書就是互聯網通訊中標誌通訊各方身份信息的一串數字,提供了一種在 Internet 上驗證通信實體身份的方式,數字證書不是數字身份證,而是身份認證機構蓋在數字身份證上的一個章或印(或者說加在數字身份證上的一個簽名)。它是由權威機構——CA 機構,又稱爲證書授權(Certificate Authority)中心發行的,人們可以在網上用它來識別對方的身份

應用場景

  • 1,交易者身份的確定性、不可否認性、不可修改性
  • 2,對應用進行簽名認證(例如 Android 的 apk)

相關加密算法代碼下載

發佈了79 篇原創文章 · 獲贊 62 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章