1. 程式人生 > 實用技巧 >aes,mysql端加密和java加密能保持一致

aes,mysql端加密和java加密能保持一致

package com.tj.qc.service.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES對稱加密和解密 */ public class AesUtil {
private static String aesKey="qianxing_well.*"; /** * 加密 * 1.構造金鑰生成器 * 2.根據ecnodeRules規則初始化金鑰生成器 * 3.產生金鑰 * 4.建立和初始化密碼器 * 5.內容加密 * 6.返回字串 */ public static String AESEncode(String content){ try { //1.構造金鑰生成器,指定為AES演算法,不區分大小寫 KeyGenerator keygen=KeyGenerator.getInstance("AES");
//2.根據ecnodeRules規則初始化金鑰生成器 //生成一個128位的隨機源,根據傳入的位元組陣列 SecureRandom secureRandom = new SecureRandom(); secureRandom.setSeed(null); keygen.init(128, secureRandom); //3.產生原始對稱金鑰 SecretKey original_key=keygen.generateKey(); //4.獲得原始對稱金鑰的位元組陣列 byte [] raw=original_key.getEncoded(); //5.根據位元組陣列生成AES金鑰 SecretKey key=new SecretKeySpec(raw, "AES"); //6.根據指定演算法AES自成密碼器 Cipher cipher=Cipher.getInstance("AES"); //7.初始化密碼器,第一個引數為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個引數為使用的KEY cipher.init(Cipher.ENCRYPT_MODE, key); //8.獲取加密內容的位元組陣列(這裡要設定為utf-8)不然內容中如果有中文和英文混合中文就會解密為亂碼 byte [] byte_encode=content.getBytes("utf-8"); //9.根據密碼器的初始化方式--加密:將資料加密 byte [] byte_AES=cipher.doFinal(byte_encode); //10.將加密後的資料轉換為字串 //這裡用Base64Encoder中會找不到包 //解決辦法: //在專案的Build path中先移除JRE System Library,再新增庫JRE System Library,重新編譯後就一切正常了。 String AES_encode=new String(new BASE64Encoder().encode(byte_AES)); //11.將字串返回 return AES_encode; } 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(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //如果有錯就返加nulll return null; } /* * 解密 * 解密過程: * 1.同加密1-4步 * 2.將加密後的字串反紡成byte[]陣列 * 3.將加密內容解密 */ public static String AESDecode(String content){ try { //1.構造金鑰生成器,指定為AES演算法,不區分大小寫 KeyGenerator keygen=KeyGenerator.getInstance("AES"); //2.根據ecnodeRules規則初始化金鑰生成器 //生成一個128位的隨機源,根據傳入的位元組陣列 SecureRandom secureRandom = new SecureRandom(); secureRandom.setSeed(null); keygen.init(128, secureRandom); //3.產生原始對稱金鑰 SecretKey original_key=keygen.generateKey(); //4.獲得原始對稱金鑰的位元組陣列 byte [] raw=original_key.getEncoded(); //5.根據位元組陣列生成AES金鑰 SecretKey key=new SecretKeySpec(raw, "AES"); //6.根據指定演算法AES自成密碼器 Cipher cipher=Cipher.getInstance("AES"); //7.初始化密碼器,第一個引數為加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二個引數為使用的KEY cipher.init(Cipher.DECRYPT_MODE, key); //8.將加密並編碼後的內容解碼成位元組陣列 byte [] byte_content= new BASE64Decoder().decodeBuffer(content); /* * 解密 */ byte [] byte_decode=cipher.doFinal(byte_content); String AES_decode=new String(byte_decode,"utf-8"); return AES_decode; } catch (Exception e) { e.printStackTrace(); return content; } } public static void main(String[] args) { //加密 String content = "開始"; // oSL3ltet8FGO2/TJzkxbog== //VQkYM4dyXVgIhC3nFkjecQ== System.out.println("加密後:"+AesUtil.AESEncode(content)); /* * 解密 */ String content2 = "fn2TTjgZjuJ11gbaN6T+miS0vJz9E6X1L+Ai6Ib79ksF+3E/eWeoVuIso+QD0cQP"; System.out.println("解密後:"+AesUtil.AESDecode(content2)); } }

SELECT to_base64(aes_encrypt('張三','123'));-- VQkYM4dyXVgIhC3nFkjecQ==

SELECT AES_DECRYPT(from_base64('VQkYM4dyXVgIhC3nFkjecQ=='),'123');