Android安全加密:消息摘要Message Digest
Android安全加密專題文章索引
1. 常見算法
MD5、SHA、CRC 等
2. 使用場景
- 對用戶密碼進行md5 加密后保存到數據庫里
- 軟件下載站使用消息摘要計算文件指紋,防止被篡改
- 數字簽名(后面知識點)
- 百度云,360網盤等云盤的妙傳功能用的就是sha1值
- Eclipse和Android Studio開發工具根據sha1值來判斷v4,v7包是否沖突
- 據說銀行的密碼使用的就是MD5加密(因為MD5具有不可逆性)
- 病毒查殺,把每個病毒文件或apk進行MD5后得到一個特征碼,拿著特征碼去跟病毒數據庫對比,特征碼一致說明該文件是病毒
- Git版本控制也使用到了sha1
例如軟件下載站數據指紋:http://dev.mysql.com/downloads/installer/
Git計算校驗
Git 用以計算校驗和的機制叫做 SHA-1 散列(hash,哈希)。這是一個由 40 個十六進制字符(0-9 和 a-f)組成字符串,基于 Git 中文件的內容或目錄結構計算出來。SHA-1 哈希看起來是這樣:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 中使用這種哈希值的情況很多,你將經常看到這種哈希值。實際上,Git 數據庫中保存的信息都是以文件內容的哈希值來索引,而不是文件名。
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. 數字摘要原理
用每個byte去和11111111(0xff)做與運算并且得到的是int類型的值
byte & 11111111
把int 類型轉成 16進制并返回String類型
- 不滿八個二進制位就補全
4.1 字節數組與16進制字符串轉換工具
/*** 字節數組與16進制字符串轉換工具*/ public class Hex {private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/*** 字節數組轉換成16進制字符串* * @param bytes* @return*/public static String encode(byte[] bytes) {if (bytes == null || bytes.length == 0) {return null;}StringBuffer sb = new StringBuffer(bytes.length * 2);// 27對應的十六進制為1b,對應的二進制是00011011// 取高位和低位:00011011-》0001,1011-》1,bfor (int i = 0; i < bytes.length; ++i) {// 取高位:跟0xf0做與運算后再右移4位int high = (bytes[i] & 0xf0) >> 4;// 0xf0: 11110000// 取低位:跟0x0f做與運算int low = bytes[i] & 0x0f;// 0x0f: 00001111// 字符映射sb.append(HEX_CHAR[high]).append(HEX_CHAR[low]);}return sb.toString();}/*** 16進制字符串轉換為字節數組* * @param hex 16進制字符 * @return*/public static byte[] decode(String hex) {if (hex == null || hex.length() == 0) {return null;}// 16進制轉byte,長度減半,"1b"-->27int len = hex.length() / 2;byte[] result = new byte[len];String highStr = null;String lowStr = null;int high = 0;int low = 0;for (int i = 0; i < len; i++) {// 高位值highStr = hex.substring(i * 2, i * 2 + 1);// "1b"的高位為"1"high = Integer.parseInt(highStr, 16);// 高位轉為10進制// 低位值lowStr = hex.substring(i * 2 + 1, i * 2 + 2);// "1b"的低位為"b"low = Integer.parseInt(lowStr, 16);// 低位轉為10進制// 合計值result[i] = (byte) ((high << 4) + low);// 相當于:(高位*16) + 低位}return result;}}5. MD5解密網站
http://www.cmd5.com/
為了提高MD5 加密的安全性,減少密文被反向解密的可能性,應盡量將密碼的長度設置的長一些,另外也可以將密碼進行多次加密,這樣可以保護用戶的隱私安全
總結
以上是生活随笔為你收集整理的Android安全加密:消息摘要Message Digest的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android安全加密:非对称加密
- 下一篇: Android安全加密:Https编程