Android安全加密:訊息摘要Message Digest

Android-Developer發表於2016-09-12

Android安全加密專題文章索引

  1. Android安全加密:對稱加密
  2. Android安全加密:非對稱加密
  3. Android安全加密:訊息摘要Message Digest
  4. Android安全加密:數字簽名和數字證照
  5. Android安全加密:Https程式設計

以上學習所有內容,對稱加密、非對稱加密、訊息摘要、數字簽名等知識都是為了理解數字證照工作原理而作為一個預備知識。數字證照是密碼學裡的終極武器,是人類幾千年歷史總結的智慧的結晶,只有在明白了數字證照工作原理後,才能理解Https 協議的安全通訊機制。最終才能在SSL 開發過程中得心應手。

另外,對稱加密和訊息摘要這兩個知識點是可以單獨拿來使用的。

知識點串聯:

數字證照使用到了以上學習的所有知識

  • 對稱加密與非對稱加密結合使用實現了祕鑰交換,之後通訊雙方使用該祕鑰進行對稱加密通訊。
  • 訊息摘要與非對稱加密實現了數字簽名,根證照機構對目標證照進行簽名,在校驗的時候,根證照用公鑰對其進行校驗。若校驗成功,則說明該證照是受信任的。
  • Keytool 工具可以建立證照,之後交給根證照機構認證後直接使用自簽名證照,還可以輸出證照的RFC格式資訊等。
  • 數字簽名技術實現了身份認證與資料完整性保證。
  • 加密技術保證了資料的保密性,訊息摘要演算法保證了資料的完整性,對稱加密的高效保證了資料處理的可靠性,數字簽名技術保證了操作的不可否認性。

通過以上內容的學習,我們要能掌握以下知識點:

  • 基礎知識:bit 位、位元組、字元、字元編碼、進位制轉換、io
  • 知道怎樣在實際開發裡怎樣使用對稱加密解決問題
  • 知道對稱加密、非對稱加密、訊息摘要、數字簽名、數字證照是為了解決什麼問題而出現的
  • 瞭解SSL 通訊流程
  • 實際開發裡怎樣請求Https 的介面

1. 常見演算法

MD5、SHA、CRC 等

2. 使用場景

  • 對使用者密碼進行md5 加密後儲存到資料庫裡
  • 軟體下載站使用訊息摘要計算檔案指紋,防止被篡改
  • 數字簽名(後面知識點)
  • 百度雲,360網盤等雲盤的妙傳功能用的就是sha1值
  • Eclipse和Android Studio開發工具根據sha1值來判斷v4,v7包是否衝突
  • 據說銀行的密碼使用的就是MD5加密(因為MD5具有不可逆性)

例如軟體下載站資料指紋:http://dev.mysql.com/downloads/installer/

這裡寫圖片描述

3. 使用步驟

//常用演算法:MD5、SHA、CRC
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 個字元
System.out.println(hex);

訊息摘要後的結果是固定長度,無論你的資料有多大,哪怕是隻有一個位元組或者是一個G 的檔案,摘要後的結果都是固定長度。

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

4. 數字摘要原理

//獲取例項
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(key.getBytes());
byte[] bytes = digest.digest(key.getBytes());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
    String hex = Integer.toHexString(bytes[i]&0xff);
    if (hex.length() == 1){
        sb.append("0");
    }
    sb.append(hex);
}
String hexstring = sb.toString();

相關文章