天天看點

md5base64 是什麼,md5 base64使用場景, base64優勢,Android 使用md5

MD5 Message-Digest Algorithm  資訊消化算法),一種被廣泛使用的密碼散列函數

md5 base64使用場景:

md5 使用者密碼存儲 檔案校驗

base64 公開的代碼圖檔檔案加密  url加密

MD5:是一種不可逆的摘要算法,用于生成摘要,無法逆破解到原文。常用的是生成32位摘要,用于驗證資料的有效性。比如,在網絡請求接口中,通過将所有的參數生成摘要,用戶端和服務端采用同樣的規則生成摘要,這樣可以防止篡改。又如,下載下傳檔案時,通過生成檔案的摘要,用于驗證檔案是否損壞。校驗使用

Base64:屬于加密算法,是可逆的,經過encode後,可以将decode得到原文。在開發中,有的公司上傳圖檔(指紋)采用的是将圖檔轉換成Base64字元串,再上傳。在做加密相關的功能時,通常會将資料進行Base64加密/解密。

base64優勢:

資料傳輸穩定

我們知道在計算機中任何資料都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字元。而在網絡上交換資料時,比如說從A地傳到B地,往往要經過多個路由裝置,由于不同的裝置對字元的處理方式有一些不同,這樣那些不可見字元就有可能被處理錯誤,這是不利于傳輸的。是以就先把資料先做一個Base64編碼,統統變成可見字元,這樣出錯的可能性就大降低了。

對證書來說,特别是根證書,一般都是作Base64編碼的,因為它要在網上被許多人下載下傳。電子郵件的附件一般也作Base64編碼的,因為一個附件資料往往是有不可見字元的。

那麼Base64到底是怎樣編碼的呢?

簡單來說,任何一個資料無非可以看作一個比特流,如01000100010011101100111010111100011001010......那麼我們取6個比特為一組,計算它的ascii值,得到一個字元,這個字元肯定是可見字元,好,把它對應的字元寫出來,再取6個比特,計算...,如此下去,直到最後,就完成了編碼。

1.标準base64隻有64個字元(英文大小寫、數字和+、/)以及用作字尾等号;

2.base64是把3個位元組變成4個可列印字元,是以base64編碼後的字元串一定能被4整除(不算用作字尾的等号);

3.等号一定用作字尾,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,base64要在後面添加\0湊齊3n位。為了正确還原,添加了幾個\0就加上幾個等号。顯然添加等号的數目隻能是0、1或2;

4.嚴格來說base64不能算是一種加密,隻能說是編碼轉換。使用base64的初衷。是為了友善把含有不可見字元串的資訊用可見字元串表示出來,以便複制粘貼;

MD5值有幾個特點:

1、它是一段固定長度的資料,即128bit的由“0”和“1”組成的一段二進制資料。無論原始資料是多長或多短,其MD5值都是128bit。

2、通常(或者叫行業規定),這段128bit的資料,按4bit一組分成32組,每一組按16進制來計算其值,并以字元的形式輸出每個值。比如一組資料按16進制計算出來的值是0-9,列印出來也是0-9,如果計算出來的值是a-f,如果直接列印的話将會是10-15,在java中可以使用String.format("%02x", bytes[i])方法來将16進制的 a-f 列印成字母“a-f”,最終這個128bit的資料将會被列印成一個32位的字元串。是以我們通常所說的MD5值就是指這串32位的由“0-9,a-f”所組成的字元串。如果你看到某個MD5不是32位,或發現其中含有“0~f”之外的字元,那肯定是個錯誤的MD5值。

3、确定性,一個原始資料的MD5值是唯一的,同一個原始資料不可能會計算出多個不同的MD5值。(唯一性)

4、碰撞性,原始資料與其MD5值并不是一一對應的,有可能多個原始資料計算出來的MD5值是一樣的,這就是碰撞。(不可逆) 是以可以校驗檔案是否損壞;

5、不可逆。也就是說如果告訴你一個MD5值,你是無法通過它還原出它的原始資料的,這不是你的技術不夠牛,這是由它的算法所決定的。因為根據第4點,一個給定的MD5值是可能對應多個原始資料的,并且理論上講是可以對應無限多個原始資料,所有無法确定到底是由哪個原始資料産生的。

Base64

實質是 一種編碼格式,如同UTF-8

是一種用64個字元來表示任意二進制資料的方法

可逆性。

可以将圖檔等二進制檔案轉換為文本檔案。

可以把非ASCII字元的資料轉換成ASCII字元,避免不可見字元。

MD5

實質是一種散清單的計算方式

不可逆性。

任意長度的明文字元串,加密後得到的密文字元串是長度固定的。

Android 使用md5 ,base64

base64:

String encodedString = Base64.encodeToString("1".getBytes(), Base64.NO_PADDING);
        Log.e("Base64", "Base64---->" + encodedString);

        String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT));
        Log.e("Base64", "Base64---->"      

MD5:

public String md5Decode32(String content) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(content.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("NoSuchAlgorithmException",e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("UnsupportedEncodingException", e);
        }
        //對生成的16位元組數組進行補零操作
        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10){
                hex.append("0");
            }
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return