題記:項目中對於一些不太重要的功能點,可以使用對稱加密,但如果是針對用戶密碼之類的,請使用MD5等加密技術。
對稱加密:是指對字符串的加密和解密是同一個密鑰,因此是存在風險的,一旦拿到了你的密鑰,內容就完全暴露了哦。
AES代碼如下:
package com.test.shiro.config; import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; /** * AES-128-CBC加解密模式 */ public class AES { /** * 加密 * * @param encData 要加密的數據 * @param secretKey 密鑰 ,16位的數字和字母 * @param vector 初始化向量,16位的數字和字母 * @return */ public static String encrypt(String encData, String secretKey, String vector) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { if (secretKey == null) { return null; } byte[] raw = secretKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/補碼方式" IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一個向量iv,可增加加密算法的強度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(encData.getBytes()); Base64.Encoder encoder = Base64.getEncoder(); return encoder.encodeToString(encrypted); } /** * 解密 * * @param decData * @param secretKey 密鑰 * @param vector 鹽 * @return */ public static String decrypt(String decData, String secretKey, String vector) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { if (secretKey == null) { return null; } if (vector == null) { return null; } byte[] raw = secretKey.getBytes("ASCII"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec(vector.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); Base64.Decoder decoder = Base64.getDecoder(); byte[] original = cipher.doFinal(decoder.decode(decData)); String originalString = new String(original); return originalString; } /** * 使用指定的字符串生成秘鑰 */ public static String getKeyByPass(String password) { //生成秘鑰 //String password="testkey00"; try { KeyGenerator kg = KeyGenerator.getInstance("AES"); // kg.init(128);//要生成多少位,只需要修改這里即可128, 192或256 //SecureRandom是生成安全隨機數序列,password.getBytes()是種子,只要種子相同,序列就一樣,所以生成的秘鑰就一樣。 kg.init(128, new SecureRandom(password.getBytes())); SecretKey sk = kg.generateKey(); byte[] b = sk.getEncoded(); String s = byteToHexString(b); return s; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); System.out.println("沒有此算法。"); } return ""; } public static byte[] generateDesKey(int length) throws Exception { //實例化 KeyGenerator kgen = null; kgen = KeyGenerator.getInstance("AES"); //設置密鑰長度 kgen.init(length); //生成密鑰 SecretKey skey = kgen.generateKey(); //返回密鑰的二進制編碼 return skey.getEncoded(); } public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { String strHex = Integer.toHexString(bytes[i]); if (strHex.length() > 3) { sb.append(strHex.substring(6)); } else { if (strHex.length() < 2) { sb.append("0" + strHex); } else { sb.append(strHex); } } } return sb.toString(); } public static void main(String[] args) { String initPsd = "werweferwer"; String secretKey =getKeyByPass(initPsd); System.out.println(secretKey); String vector= "1234rt5t34tergy6"; String encrptyData = "yangweref"; try { String encryptPassword = encrypt(encrptyData, secretKey, vector); System.out.println(encryptPassword); String decrptyPassword = decrypt(encryptPassword,secretKey,vector); System.out.println(decrptyPassword); }catch (Exception e){ e.printStackTrace(); } } }
fight!一起加油哦!