Java加密技術(一)——BASE64與單向加密算法MD5&SHA&MAC

基本的單向加密算法:java

  BASE64 嚴格地說,屬於編碼格式,而非加密算法linux

  MD5(Message Digest algorithm 5,信息摘要算法)git

  SHA(Secure Hash Algorithm,安全散列算法)算法

  HMAC(Hash Message Authentication Code,散列消息鑑別碼)數組

複雜的對稱加密(DES、PBE)、非對稱加密算法:安全

  DES(Data Encryption Standard,數據加密算法)函數

  PBE(Password-based encryption,基於密碼驗證)工具

  RSA(算法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)編碼

  DH(Diffie-Hellman算法,密鑰一致協議)加密

  DSA(Digital Signature Algorithm,數字簽名)

  ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學)

下面簡要介紹BASE6四、MD五、SHA、HMAC幾種方法:

  MD五、SHA、HMAC這三種加密算法,可謂是非可逆加密,就是不可解密的加密方法。咱們一般只把他們做爲加密的基礎。單純的以上三種的加密並不可靠。

BASE64

  按照RFC2045的定義,Base64被定義爲:Base64內容傳送編碼被設計用來把任意序列的8位字節描述爲一種不易被人直接識別的形式。

  (The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

  常見於郵件、http加密,截取http信息,你就會發現登陸操做的用戶名、密碼字段經過BASE64加密的。

經過java代碼實現以下(JDK原生實現,第三方請自行實現):

 1 /**
 2      * BASE64加密
 3      * @param key
 4      * @return
 5      */
 6     public static String encryptBASE64(byte[] key){
 7         BASE64Encoder base64Encoder = new BASE64Encoder();
 8         String encode = base64Encoder.encode(key);
 9         return encode;
10     }
11     /**
12      * BASE64解密
13      * @param key
14      * @return
15      * @throws Exception
16      */
17     public static byte[] decryptBASE64(String key) throws Exception{
18         BASE64Decoder base64Decoder = new BASE64Decoder();
19         byte[] decodeBuffer = base64Decoder.decodeBuffer(key);
20         return decodeBuffer;
21     }

主要就是BASE64Encoder、BASE64Decoder兩個類,咱們只須要知道使用對應的方法便可。另,BASE加密後產生的字節位數是8的倍數,若是不夠位數以=符號填充。

MD5 

MD5 -- message-digest algorithm 5(信息-摘要算法)縮寫,普遍用於加密和解密技術,經常使用於文件校驗。校驗?無論文件多大,通過MD5後都能生成惟一的MD5值。比如如今的

ISO校驗,都是MD5校驗。怎麼用?固然是把ISO通過MD5後產生MD5的值。通常下載linux-ISO的朋友都見過下載連接旁邊放着MD5的串。就是用來驗證文件是否一致的。

經過java代碼實現以下:

 1 /**
 2      * MD5加密
 3      * @param data
 4      * @return
 5      * @throws Exception
 6      */
 7     public static byte[] encryptMD5(byte[] data) throws Exception{
 8         MessageDigest md5 = MessageDigest.getInstance("MD5");
 9         md5.update(data);
10         byte[] result = md5.digest();
11         return result;
12     }

一般咱們不直接使用上述MD5加密。一般將MD5產生的字節數組交給BASE64再加密一把,獲得相應的字符串。

SHA 

SHA(Secure Hash Algorithm,安全散列算法),數字簽名等密碼學應用中重要的工具,被普遍地應用於電子商務等信息安全領域。雖然,SHA與MD5經過碰撞法都被破解了, 可是

SHA仍然是公認的安全加密算法,較之MD5更爲安全。

經過java代碼實現以下:

 1 /**
 2      * SHA加密
 3      * @param data
 4      * @return
 5      * @throws Exception
 6      */
 7     public static byte[] encryptSHA(byte[] data) throws Exception{
 8         MessageDigest sha = MessageDigest.getInstance("SHA");
 9         sha.update(data);
10         byte[] result = sha.digest();
11         return result;
12     }

HMAC 

HMAC(Hash Message Authentication Code,散列消息鑑別碼,基於密鑰的Hash算法的認證協議。消息鑑別碼實現鑑別的原理是,用公開函數和密鑰產生一個固定長度的值做爲認

證標識,用這個標識鑑別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,而後傳輸。接收方利用與發送方共享的密鑰進行鑑別認證等。

經過java代碼實現以下:

 1 /**
 2      * 初始化HMAC密鑰
 3      * @return
 4      * @throws Exception
 5      */
 6     public static String initMacKey() throws Exception{
 7         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
 8         SecretKey secretKey = keyGenerator.generateKey();
 9         String initKey = encryptBASE64(secretKey.getEncoded());
10         return initKey;
11     }
12     /**
13      * HMAC加密
14      * @param data
15      * @param key
16      * @return
17      * @throws Exception
18      */
19     public static byte[] encryptHMAC(byte[] data,String key) throws Exception{
20         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
21         Mac mac = Mac.getInstance(secretKey.getAlgorithm());
22         mac.init(secretKey);
23         byte[] res = mac.doFinal(data);
24         return res;
25     }

BASE64Encoder和BASE64Decoder是非官方JDK實現類。雖然能夠在JDK裏能找到並使用,可是在API裏查不到。JRE 中 sun 和 com.sun 開頭包的類都是未被文檔化的,他們屬

於 java, javax 類庫的基礎,其中的實現大多數與底層平臺有關,通常來講是不推薦使用的。

 

BASE64的加密解密是雙向的,能夠求反解。 

MD五、SHA以及HMAC是單向加密,任何數據加密後只會產生惟一的一個加密串,一般用來校驗數據在傳輸過程當中是否被修改。其中HMAC算法有一個密鑰,加強了數據傳輸過程當中

的安全性,強化了算法外的不可控因素。

單向加密的用途主要是爲了校驗數據在傳輸過程當中是否被修改。

相關文章
相關標籤/搜索