衆多的加密手段大體能夠分爲單項加密和雙向加密。單項加密指經過對數據進行摘要計算生成密文,密文不可逆推還原,好比有Base6四、MD五、SHA等;雙向加密則相反,指能夠把密文逆推還原成明文,其中雙向加密又分爲對稱加密和非對稱加密。對稱加密是指數據使用者必須擁有一樣的密鑰才能夠進行加密解密,就像你們共同約定了一組暗號同樣,對稱加密的手段有DES、3DES、AES、IDEA、RC四、RC5等;而非對稱加密相對於對稱加密而言,無需擁有同一組密鑰,它是一種「信息公開的密鑰交換協議」。非對稱加密須要公開密鑰和私有密鑰兩組密鑰,公開密鑰和私有密鑰是配對起來的,也就是說使用公開密鑰進行數據加密,只有對應的私有密鑰才能進行解密。此類的加密手段有RSA、DSA等java
因此使用了3DES進行加密。具體代碼以下
算法
/** * * 使用3DES進行數據的加密 和 解密 * * Created by abing on 2015/11/5. */ public class SecurituyLevel { //目前使用先這地方使用 後面去數據庫進行查詢 並進行操做 private static final String Algorithm = "DESede"; private static final String PASWORD_KEY = "";//輸入本身的加密密鑰 /** * 加密算法 * * @param src 源數據的字節數組 * @return */ public static byte[] encyptMode(byte[] src) { try { SecretKey desKey = new SecretKeySpec( buildDesKey(PASWORD_KEY), Algorithm); Cipher cipher = Cipher.getInstance(Algorithm); cipher.init(Cipher.ENCRYPT_MODE, desKey); return cipher.doFinal(src); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } /** * 解密密算法 * @param src * @return */ public static byte[] decryptMode(byte[] src){ try { SecretKey desKey = new SecretKeySpec(buildDesKey(PASWORD_KEY) , Algorithm); Cipher cipher = Cipher.getInstance(Algorithm); cipher.init(Cipher.DECRYPT_MODE, desKey); return cipher.doFinal(src); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); }catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } /** * 根據加密字符串生成密鑰字節數組 * * * @param keyStr 密鑰字符串 * @return */ public static byte[] buildDesKey(String keyStr){ try { byte[] key = new byte[24]; byte[] tmp = keyStr.getBytes("UTF-8"); if (key.length > tmp.length){ System.arraycopy(tmp , 0 , key , 0 , tmp.length); } else { System.arraycopy(tmp , 0 , key , 0 , key.length); } return key; } catch (UnsupportedEncodingException e) { PlatformLogger.error("buildDesKay is error" , e); } return null; } }
上面的代碼是進行加密,解密使用數據庫
因爲系統中須要對字符串進行加密 解密 而3DES生成的密文,轉換成字符串,再解密的時候會報錯。因此引用了BASE64進行編碼,以及解碼。數組
Base64是網絡上最多見的用於傳輸8Bit字節代碼的編碼方式之一,你們能夠查看RFC2045~RFC2049,上面有MIME的詳細規範。Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的惟一標識符(通常爲128-bit的UUID)編碼爲一個字符串,用做HTTP表單和HTTP GET URL中的參數。在其餘應用程序中,也經常須要把二進制數據編碼爲適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼具備不可讀性,即所編碼的數據不會被人用肉眼所直接看到。網絡
BASE64 是編碼,解碼的,不是加密,解密的方法。 把3DES生成的字節數組 , 經過BASE64進行編碼。生成相應的字符。ui
/** * 編碼 * * @param src * @return */ public static String encode(byte[] src){ return new BASE64Encoder().encode(src); } /** * 解碼 * * @param src * @return */ public static byte[] decode(String src) { byte[] b = null; try { BASE64Decoder decoder = new BASE64Decoder(); b = decoder.decodeBuffer(src); } catch (IOException e) { e.printStackTrace(); } return b; }
上面是用BASE64進行編碼 , 解碼的操做。編碼
具體的加密流程爲:加密
利用3DES加密 , 而後再用BASE64編碼生成加密的字符串
解密流程爲:spa
首先用BASE64解碼 , 生成相應的字節數組 , 再用3DES解密 , 返回相應的字符串
一個完整的加解密過程完成了。code