题记:项目中对于一些不太重要的功能点,可以使用对称加密,但如果是针对用户密码之类的,请使用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!一起加油哦!