1. 程式人生 > 實用技巧 >java中sha1.md5,base64到底怎麼回事

java中sha1.md5,base64到底怎麼回事

MD5

Message Digest Algorithm MD5(中文名為訊息摘要演算法第五版)為電腦保安領域廣泛使用的一種雜湊函式,用以提供訊息的完整性保護。MD5用的是雜湊函式,在計算機網路中應用較多的不可逆加密演算法有RSA公司發明的MD5演算法和由美國國家技術標準研究所建議的安全雜湊演算法SHA。

//MD5摘要後轉大寫   
String str0 = DigestUtils.md5Hex("abc").toUpperCase();  
System.out.println(str0);

SHA1

安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的訊息,SHA1會產生一個160位的訊息摘要。當接收到訊息的時候,這個訊息摘要可以用來驗證資料的完整性。在傳輸的過程中,資料很可能會發生變化,那麼這時候就會產生不同的訊息摘要。 SHA1有如下特性:不可以從訊息摘要中復原資訊;兩個不同的訊息不會產生同樣的訊息摘要。

  • 實現一
//這個方法已經過期
String sha1 = DigestUtils.shaHex(bytes);

//使用這個方法
String sha1 = DigestUtils.sha1Hex(bytes);
System.out.println(sha1);
  • 實現二
/**
     * sha1加密
     * @param data
     * @return
     * @throws NoSuchAlgorithmException 
     */
    public static String sha1(String data) throws NoSuchAlgorithmException {
        //加鹽   更安全一些
        data += "lyz";
        //資訊摘要器                                演算法名稱
        MessageDigest md = MessageDigest.getInstance("SHA1");
        //把字串轉為位元組陣列
        byte[] b = data.getBytes();
        //使用指定的位元組來更新我們的摘要
        md.update(b);
        //獲取密文  (完成摘要計算)
        byte[] b2 = md.digest();
        //獲取計算的長度
        int len = b2.length;
        //16進位制字串
        String str = "0123456789abcdef";
        //把字串轉為字串陣列
        char[] ch = str.toCharArray();
        
        //建立一個40位長度的位元組陣列
        char[] chs = new char[len*2];
        //迴圈20次
        for(int i=0,k=0;i<len;i++) {
            byte b3 = b2[i];//獲取摘要計算後的位元組陣列中的每個位元組
            // >>>:無符號右移  
            // &:按位與
            //0xf:0-15的數字
            chs[k++] = ch[b3 >>> 4 & 0xf];
            chs[k++] = ch[b3 & 0xf];
        }
        
        //字元陣列轉為字串
        return new String(chs);
    }

Base64

編碼可用於在HTTP環境下傳遞較長的標識資訊。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一識別符號(一般為128-bit的UUID)編碼為一個字串,用作HTTP表單和HTTP GET URL中的引數。在其他應用程式中,也常常需要把二進位制資料編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的資料不會被人用肉眼所直接看到。
  然而,標準的Base64並不適合直接放在URL裡傳輸,因為URL編碼器會把標準Base64中的“/”和“+”字元變為形如“%XX”的形式,而這些“%”號在存入資料庫時還需要再進行轉換,因為ANSI SQL中已將“%”號用作萬用字元。
  為解決此問題,可採用一種用於URL的改進Base64編碼,它不在末尾填充'='號,並將標準Base64中的“+”和“/”分別改成了“”和“-”,這樣就免去了在URL編解碼和資料庫儲存時所要作的轉換,避免了編碼資訊長度在此過程中的增加,並統一了資料庫、表單等處物件識別符號的格式。
  另有一種用於正則表示式的改進Base64變種,它將“+”和“/”改成了“!”和“-”,因為“+”,“

”以及前面在IRCu中用到的“[”和“]”在正則表示式中都可能具有特殊含義。
  此外還有一些變種,它們將“+/”改為“-”或“.”(用作程式語言中的識別符號名稱)或“.-”(用於XML中的Nmtoken)甚至“_:”(用於XML中的Name)。

//Base64加密 ,abc為要加密的字串        
String str2= "abc"; 
//一般加密
byte[] b = Base64.encodeBase64(str2.getBytes(), true);
//URL引數傳遞避免特殊符號
byte[] b = Base64.encodeBase64URLSafe(str2.getBytes());   
System.out.println(new String(b));


//Base64解密,YWJj為要解密的字串  
String str3 = "YWJj"; 
byte[] b1 = Base64.decodeBase64(str3.getBytes());   
System.out.println(new String(b1));