基本的單向加密算法: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算法有一個密鑰,加強了數據傳輸過程當中
的安全性,強化了算法外的不可控因素。
單向加密的用途主要是爲了校驗數據在傳輸過程當中是否被修改。