日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發(fā)布時間:2025/4/16 Android 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android安全加密:消息摘要Message Digest 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android安全加密專題文章索引

  • Android安全加密:對稱加密
  • Android安全加密:非對稱加密
  • Android安全加密:消息摘要Message Digest
  • Android安全加密:數(shù)字簽名和數(shù)字證書
  • Android安全加密:Https編程
  • 1. 常見算法

    MD5、SHA、CRC 等

    2. 使用場景

    • 對用戶密碼進行md5 加密后保存到數(shù)據(jù)庫里
    • 軟件下載站使用消息摘要計算文件指紋,防止被篡改
    • 數(shù)字簽名(后面知識點)
    • 百度云,360網(wǎng)盤等云盤的妙傳功能用的就是sha1值
    • Eclipse和Android Studio開發(fā)工具根據(jù)sha1值來判斷v4,v7包是否沖突
    • 據(jù)說銀行的密碼使用的就是MD5加密(因為MD5具有不可逆性)
    • 病毒查殺,把每個病毒文件或apk進行MD5后得到一個特征碼,拿著特征碼去跟病毒數(shù)據(jù)庫對比,特征碼一致說明該文件是病毒
    • Git版本控制也使用到了sha1

    例如軟件下載站數(shù)據(jù)指紋:http://dev.mysql.com/downloads/installer/

    Git計算校驗

    Git 用以計算校驗和的機制叫做 SHA-1 散列(hash,哈希)。這是一個由 40 個十六進制字符(0-9 和 a-f)組成字符串,基于 Git 中文件的內(nèi)容或目錄結(jié)構(gòu)計算出來。SHA-1 哈希看起來是這樣:

    24b9da6552252987aa493b52f8696cd6d3b00373

    Git 中使用這種哈希值的情況很多,你將經(jīng)??吹竭@種哈希值。實際上,Git 數(shù)據(jù)庫中保存的信息都是以文件內(nèi)容的哈希值來索引,而不是文件名。

    3. 使用步驟

    //常用算法:MD5、SHA、CRC MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] result = digest.digest(content.getBytes()); //消息摘要的結(jié)果一般都是轉(zhuǎn)換成16 進制字符串形式展示 String hex = Hex.encode(result); //MD5 結(jié)果為16 字節(jié)(128 個比特位)、轉(zhuǎn)換為16 進制表示后長度是32 個字符 //SHA 結(jié)果為20 字節(jié)(160 個比特位)、轉(zhuǎn)換為16 進制表示后長度是40 個字符 System.out.println(hex);

    消息摘要后的結(jié)果是固定長度,無論你的數(shù)據(jù)有多大,哪怕是只有一個字節(jié)或者是一個G 的文件,摘要后的結(jié)果都是固定長度。

    經(jīng)常聽到有人問這樣的問題,MD5 摘要后結(jié)果到底是多少位?有的人說是16 位,有的說是128 位,有的說是32 位。到底是多長,這個時候我們就要明白,16 位指的是字節(jié)位數(shù),128 位指的是比特位,32 位指的結(jié)果轉(zhuǎn)換成16 進制展示的字符位數(shù)。

    4. 數(shù)字摘要原理

    • 用每個byte去和11111111(0xff)做與運算并且得到的是int類型的值

      byte & 11111111

    • 把int 類型轉(zhuǎn)成 16進制并返回String類型

    • 不滿八個二進制位就補全
    //獲取實例 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(); public class MD5Utils {public static String encode(String pwd) {// MessageDigest 消息摘要try {MessageDigest digester = MessageDigest.getInstance("MD5");// 加密,將要加密的字符串轉(zhuǎn)換成字節(jié)數(shù)組byte[] digest = digester.digest(pwd.getBytes());StringBuffer buffer = new StringBuffer();// 0000-0101// 1111-1111// 0000-0101for (byte b : digest) {// 0xff 表示低8 位int number = b & 0xff;// int 32 位一個int 是四個字節(jié)一個字節(jié)8 位// 任何一個值& 等于0// & 1 = 1String hexString = Integer.toHexString(number);if (hexString.length() == 1) {buffer.append("0" + hexString);} else {buffer.append(hexString);}}System.out.println("密碼長度---" + buffer.toString().length());System.out.println("密碼---" + buffer.toString());return buffer.toString();} catch (Exception e) {e.printStackTrace();}return "";} }

    4.1 字節(jié)數(shù)組與16進制字符串轉(zhuǎn)換工具

    /*** 字節(jié)數(shù)組與16進制字符串轉(zhuǎn)換工具*/ 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' };/*** 字節(jié)數(shù)組轉(zhuǎn)換成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對應(yīng)的十六進制為1b,對應(yīng)的二進制是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進制字符串轉(zhuǎn)換為字節(jié)數(shù)組* * @param hex 16進制字符 * @return*/public static byte[] decode(String hex) {if (hex == null || hex.length() == 0) {return null;}// 16進制轉(zhuǎn)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);// 高位轉(zhuǎn)為10進制// 低位值lowStr = hex.substring(i * 2 + 1, i * 2 + 2);// "1b"的低位為"b"low = Integer.parseInt(lowStr, 16);// 低位轉(zhuǎn)為10進制// 合計值result[i] = (byte) ((high << 4) + low);// 相當(dāng)于:(高位*16) + 低位}return result;}}

    5. MD5解密網(wǎng)站

    http://www.cmd5.com/

    為了提高MD5 加密的安全性,減少密文被反向解密的可能性,應(yīng)盡量將密碼的長度設(shè)置的長一些,另外也可以將密碼進行多次加密,這樣可以保護用戶的隱私安全

    總結(jié)

    以上是生活随笔為你收集整理的Android安全加密:消息摘要Message Digest的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。