提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
備忘錄:加密key為:vU4C!~0_HQtlU_p@ 可采用任意長度為16位的字符串
數(shù)據(jù)庫數(shù)據(jù)需要對敏感數(shù)據(jù)進行加密,比如手機號,身份證號以及銀行卡號等進行加密。需要一套通用的加密方法可以在java項目以及oracle和mysql數(shù)據(jù)庫中通用。于是在參考其他博主文件后有如下解決方案。此博客僅作為備忘錄使用,并作技術交流。。
一、Mysql
加密:
SELECT to_base64(AES_ENCRYPT(‘4564879512346895654’,‘vU4C!~0_HQtlU_p@’));
解密:
SELECT AES_DECRYPT(from_base64(‘sQtqbsu/05NDCngxv/3al84bdzwtIFG91Zr6hZDpOvE=’),
‘vU4C!~0_HQtlU_p@’);
解密出來時blob文本如果想改成string可以使用如下解密語句
SELECT CONVERT(AES_DECRYPT(from_base64('sQtqbsu/05NDCngxv/3al84bdzwtIFG91Zr6hZDpOvE='),
'vU4C!~0_HQtlU_p@') USING utf8mb4) as field_value;
二、Oracle
1.賦予角色加密權限并創(chuàng)建函數(shù)
因為是oracle,所以首先得確定你使用的角色是否擁有加密數(shù)據(jù)的權限,否則無法使用DBMS_CRYPTO包。
oracle常用的權限查詢指令
查看擁有權限的用戶有哪些:
select * from dba_tab_privs where table_name = 'DBMS_CRYPTO' and owner = 'SYS';
執(zhí)行以下sql:grant execute on sys.dbms_crypto to myuser;//myuser 是你oracle當前使用的角色
函數(shù)如下(示例):
-- 加密
create or replace FUNCTION FUN_ENCRYPTION(
V_STR VARCHAR2
)
RETURN VARCHAR2
AS
V_KEY_RAW RAW(16) ;
V_STR_RAW RAW(2000) ;
V_RETURN_STR VARCHAR2(2000) ;
V_TYPE PLS_INTEGER ;
BEGIN
IF V_STR IS NULL OR V_STR = 'null' THEN
BEGIN
RETURN V_STR;
END;
ELSE
BEGIN
V_KEY_RAW := UTL_I18N.STRING_TO_RAW('vU4C!~0_HQtlU_p@','UTF8') ;
V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR,'UTF8') ;
V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128+DBMS_CRYPTO.CHAIN_ECB+DBMS_CRYPTO.PAD_PKCS5 ;
V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW) ;
V_RETURN_STR := utl_raw.cast_to_varchar2(utl_encode.base64_encode(V_STR_RAW));
RETURN V_RETURN_STR ;
END;
END IF ;
END;
-- 解密
create or replace FUNCTION FUN_DECRYPTION(
V_STR VARCHAR2
)
RETURN VARCHAR2
AS
V_KEY_RAW RAW(16) ;
V_STR_RAW RAW(2000) ;
V_RETURN_STR VARCHAR2(2000) ;
V_TYPE PLS_INTEGER ;
BEGIN
IF V_STR IS NULL OR V_STR = 'null' THEN
BEGIN
RETURN V_STR;
END;
ELSE
BEGIN
V_KEY_RAW := UTL_I18N.STRING_TO_RAW('vU4C!~0_HQtlU_p@','UTF8') ;
V_STR_RAW := utl_encode.base64_decode(utl_raw.cast_to_raw((V_STR)));
V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128+DBMS_CRYPTO.CHAIN_ECB+DBMS_CRYPTO.PAD_PKCS5 ;
V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW ) ;
V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW,'UTF8');
RETURN V_RETURN_STR ;
END;
END IF ;
END;
2.示例以及說明
sql如下(示例):文章來源:http://www.zghlxwxcb.cn/news/detail-557947.html
/**
* 擁有對應權限項才能正常執(zhí)行sql
**/
SELECT FUN_ENCRYPTION('4564879512346895654') FROM dual;
SELECT FUN_DECRYPTION('sQtqbsu/05NDCngxv/3al84bdzwtIFG91Zr6hZDpOvE=') FROM dual;
3.java程序代碼以及對應說明
package com.fang.common.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
/**
* @Author LemonOvO
* @Date 2022/8/31 10:10
* @Version 1.0
* @Description 對應的加密解密方法 適用項目是SpringBoot項目 加密key配置在Apollo中,若無配置可以
* 使用靜態(tài)常量寫死在代碼之中
* @Project xxxx
*/
@Slf4j
@Component
public class AesEncoder {
@Value("${database.encrypt.key:vU4C!~0_HQtlU_p@}")
private void setsKey(String sKey) {
AesEncoder.S_KEY = sKey;
}
private static String S_KEY;
// 加密
public static String encrypt(String sSrc) throws Exception {
if(Utils.isBlank(sSrc)){
return sSrc;
}
if (S_KEY == null) {
System.out.print("Key為空null");
return null;
}
// 判斷Key是否為16位
if (S_KEY.length() != 16) {
System.out.print("Key長度不是16位");
return null;
}
byte[] raw = S_KEY.getBytes(StandardCharsets.UTF_8);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
//"算法/模式/補碼方式"
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes(StandardCharsets.UTF_8));
//此處使用BASE64做轉碼功能,同時能起到2次加密的作用。
return new BASE64Encoder().encode(encrypted);
}
// 解密
public static String decrypt(String sSrc) throws Exception {
try {
// 判斷Key是否正確
if (S_KEY == null) {
System.out.print("Key為空null");
return null;
}
// 判斷Key是否為16位
if (S_KEY.length() != 16) {
System.out.print("Key長度不是16位");
return null;
}
byte[] raw = S_KEY.getBytes(StandardCharsets.UTF_8);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//先用base64解密
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);
try {
byte[] original = cipher.doFinal(encrypted1);
return new String(original, StandardCharsets.UTF_8);
} catch (Exception e) {
log.error("數(shù)據(jù)庫解密失敗:", e);
return null;
}
} catch (Exception ex) {
log.error("數(shù)據(jù)庫解密失敗:", ex);
return null;
}
}
/**
* 加密字符
*
* @param source 來源字符串 例:17799999999
* @param begin 字符串加密開頭保留的明文長度 例:3
* @param end 字符串加密結尾處保留的明文長度 例:4
* @return 加密后結果 例:177****9999
*/
public static String encryptString(String source, Integer begin, Integer end) {
if(Utils.isBlank(source)){
return source;
}
int length = source.length();
if (begin >= length) {
return encryptRule(source);
}
if (begin < 0) {
begin = 0;
}
if (end < 0) {
end = 0;
}
char[] chars = source.toCharArray();
char[] result = new char[chars.length];
for (int i = 0; i < chars.length; i++) {
if (i >= begin) {
if (i >= (length - end)) {
result[i] = chars[i];
} else {
result[i] = '*';
}
} else {
result[i] = chars[i];
}
}
String encrypt = String.valueOf(result);
if (encrypt.contains("*")) {
return encrypt;
} else {
return encryptRule(encrypt);
}
}
private static String encryptRule(String source) {
char[] chars = source.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < chars.length; i++) {
stringBuilder.append("*");
}
return stringBuilder.toString();
}
public static void main(String[] args) throws Exception {
/*
* 此處使用AES-128-ECB加密模式,key需要為16位。
*/
String cKey = "GISQvI1Wk@@Lz7%?";
// 需要加密的字串
String cSrc = "zhangsan";
System.out.println(cSrc);
// 加密
String enString = AesEncoder.encrypt(cSrc);
System.out.println("加密后的字串是:" + enString);
// 解密
String deString = AesEncoder.decrypt(enString);
System.out.println("解密后的字串是:" + deString);
}
}
總結
參考文獻地址:Mysql Oracle java 通用aes加密文章來源地址http://www.zghlxwxcb.cn/news/detail-557947.html
到了這里,關于數(shù)據(jù)庫加密AES 適用 Mysql Oracle 以及java的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!