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));