資料庫敏感字段快速方便地加密解密

2021-10-21 19:44:51 字數 4088 閱讀 9506

業務背景:使用者插入資料時,敏感欄位要加密入庫;展示在前端時是解密後的。

但是加密後欄位只能精確篩選了。

使用的是sm4國密演算法

匯入依賴:

>

>

org.bouncycastlegroupid

>

>

bcprov-ext-jdk15onartifactid

>

>

1.58version

>

>

compilescope

>

dependency

>

>

>

org.bouncycastlegroupid

>

>

bcprov-jdk15onartifactid

>

>

1.58version

>

>

compilescope

>

dependency

>

>

>

com.jd.blockchaingroupid

>

>

crypto-smartifactid

>

>

1.1.2.releaseversion

>

dependency

>

工具類:

public

class

smutil

private

static logger logger = logge***ctory.

getlogger

("smutil");

private

static

final

byte

secret_key = stringutils.

getbytesutf8

("b#uhhqyqttkgae08");

//帶偏移量的金鑰和偏移量似乎是固定16位長度的

private

static

final

byte

iv = stringutils.

getbytesutf8

("ivuhm**qkkkgaei8");

private

static

final string smencrypt_pre =

"smencrypt#"

;/**

* 將明文本串加密成密文後,用base64編碼,並加上smencrypt#作為字首

* @param plainstr 明文本串

* @return base64編碼後的密文,並且加上 smencrypt# 字首

*/public

static string encrypt

(string plainstr)

string encresult = null;

trycatch

(unsupportedencodingexception e)

return encresult;

}/**

* 國密演算法解密,要有字首smencrypt#

* @param encstr 加密字串,要有字首smencrypt#,表示是通過國密演算法加密的

* @return

*/public

static string decrypt

(string encstr)

string decresult = null;

string removepre = org.apache.commons.lang3.stringutils.

remove

(encstr, smencrypt_pre)

;try

catch

(unsupportedencodingexception e)

return decresult;

}/**

* 判斷是否用國密演算法加密過,通過判斷字首是否有smencrypt#

* @return 有smencrypt#為true表示用了國密演算法加密了

*/public

static

boolean

isencryptbysmcrypto

(string encstr)

}

public

class

smcryptotypehandler

extends

basetypehandler

@override

public string getnullableresult

(resultset resultset, string s)

throws sqlexception

@override

public string getnullableresult

(resultset resultset,

int i)

throws sqlexception

@override

public string getnullableresult

(callablestatement callablestatement,

int i)

throws sqlexception

}

"baseresultmap1"

type

="com.thunisoft.dzsjdc.repository.model.tyws**bxx"

>

column

="c_id"

jdbctype

="char"

property

="cid"

/>

column

="c_bdcrxm"

jdbctype

="varchar"

property

="cbdcrxm"

typehandler

="com......smcryptotypehandler"

/>

column

="c_bdcrsf"

jdbctype

="varchar"

property

="cbdcrsf"

typehandler

="com......smcryptotypehandler"

/>

column

="c_bdcrzw"

jdbctype

="varchar"

property

="cbdcrzw"

typehandler

="com......smcryptotypehandler"

/>

column

="c_saay"

jdbctype

="varchar"

property

="csaay"

/>

column

="c_bwtdwid"

jdbctype

="varchar"

property

="cbwtdwid"

/>

resultmap

>

第二步:實體類的對應敏感欄位上加上註解@columntype,示例如下:

@column

(name =

"c_bdcrxm"

)@apimodelproperty

("..."

)@columntype

(typehandler = smcryptotypehandler.

class

)private string cbdcrxm;

第三步:敏感字段作為篩選條件的查詢語句、敏感字段插入資料庫時,做出如下處理:

and c_bdcrxm like 

concat('%', #,'%')

mysql資料庫字段加密

linux version centos7.3 mysql vrsion mysql5.6.34 最近兩天,接到業務上乙個需求,需要對錶中的部分字段 比如手機號,email 進行加密,在檢視mysql的相關資料後,發現需要對資料庫中的部分字段加密,基本就只能從業務層面的角度來實現。大概提供了如下幾個...

MySQL資料庫字段加密

一 匯入表結構 use qskj 03 table structure for table test drop table if exists test create table test id int 10 not null auto increment comment 主鍵 username v...

mysql欄位加密儲存過程 資料庫 加密儲存過程

如何簡單的建立乙個加密儲存過程 create proc test 引數列表 with encription as主體 go為了演示,現在我們建立乙個具備各種引數型別的儲存過程作為測試 create proc test x int 3,s nvarchar 20 y int output with e...