1. 程式人生 > >mysql資料庫中針對敏感資訊欄位加密處理問題

mysql資料庫中針對敏感資訊欄位加密處理問題

最近有這樣一個需求,針對系統中的敏感資訊,如供應商的手機號碼,銀行賬號等需要做加密處理。比較常見的加密方式如md5,但是公司架構組的給出的方案是:統一在資料庫處理,使用mysql的加密函式AES_ENCRYPT(’‘明文,‘加密key’)和解密函式AES_DECRYPT(’'明文,‘加密key’),加密key可配置。

經過一天的更改測試完成,做個總結,記錄下此過程中遇到的問題及解決方法。

在原表中增加儲存加密資訊的欄位,如新增欄位encrypt_mobile,encrypt_bank_num分別對應之前的mobile,bank_num

處理方案:

1、在常量類中新增靜態的常量:

package com.lyc.common.constant;
public class CommonConstant {
	public static final String MYSQL_ENTRYPT_KEY = "entryptkey";
}

2、mybatis的mapper.xml中新增資料的sql更改如下:

insert into table (encrypt_mobile,encrypt_bank_num) 
values(
AES_ENCRYPT(#{encryptMobile},'${@[email protected]_ENTRYPT_KEY}'),
AES_ENCRYPT(#{encryptBankNum},'${@[email protected]_ENTRYPT_KEY}')
);

3、查詢手機號、銀行賬號,在mybatis的mapper.xml中查詢sql更改如下:

select AES_DECRYPT(encrypt_mobile,'${@
[email protected]
_ENTRYPT_KEY}') as mobile, AES_DECRYPT(encrypt_bank_num,'${@[email protected]_ENTRYPT_KEY}') as bank_num from table;

效果如圖:
在這裡插入圖片描述

資料成功加密並儲存了,但是看起來像亂碼,而且解密返回的結果為null,有問題。查資料發現mysql還有兩個函式,HEX()和UNHEX()。HEX()可以將一個字串或數字轉換為十六進位制格式的字串,UNHEX()把十六進位制格式的字串轉化為原來的格式。

解決方案:

1、mybatis的mapper.xml中新增資料的sql更改如下:

insert into table (encrypt_mobile,encrypt_bank_num) 
values(
HEX(AES_ENCRYPT(#{encryptMobile},'${@[email protected]_ENTRYPT_KEY}')),
HEX(AES_ENCRYPT(#{encryptBankNum},'${@[email protected]_ENTRYPT_KEY}'))
);

2、查詢手機號、銀行賬號,在mybatis的mapper.xml中查詢sql更改如下:

select AES_DECRYPT(UNHEX(encrypt_mobile),'${@[email protected]_ENTRYPT_KEY}') as mobile,
AES_DECRYPT(UNHEX(encrypt_bank_num),'${@[email protected]_ENTRYPT_KEY}') as bank_num
from table;

效果如圖:
在這裡插入圖片描述

相關推薦

mysql資料庫針對敏感資訊加密處理問題

最近有這樣一個需求,針對系統中的敏感資訊,如供應商的手機號碼,銀行賬號等需要做加密處理。比較常見的加密方式如md5,但是公司架構組的給出的方案是:統一在資料庫處理,使用mysql的加密函式AES_ENCRYPT(’‘明文,‘加密key’)和解密函式AES_DEC

MySQL資料庫增加和刪除

mysql> create table id_name(id int,name varchar(20)); Query OK, 0 rows affected (0.13 sec) mysql> alter table id_name add age int,add address va

postgresql資料庫geometry型別的插入經緯度指令碼

在postgresql資料庫中,如果欄位型別是geometry,我們要更新該欄位為經緯度(座標),可以嘗試採取以下指令碼: update device set shape = ST_GeomFromText(‘POINT(108.658463 34.1437)’, 4610) where n

SqlServer資料庫常用的時間格式化

可用convert函式。 下列出一些常用的語法: 1、輸出格式:2008-02-27 00:25:13 SELECT CONVERT(char(19), getdate(), 120) 2、輸出格式:2008-02-27 SELECT CONVERT(char(10),

java生成mysql資料庫建表語句、型別、註釋,可實現不用mysqldump備份資料庫

使用 mysqldump 備份資料庫也是可行的,因為每次備份的時候都需要mysqldump這個檔案, 我在windows備份時沒問題,但是放到linux上面時,centos系統死活不認這個檔案,但又不想裝mysql,一氣之下自己研究了個不需要mysqldump就可以備份的程式, 如果看了以下程式

JDBC批量加密mysql已有的密碼資料

前言:       公司要求把mysql資料庫的user表中,把表中已有的使用者註冊的密碼資訊給加密處理,原本是沒有加密的,是明文。今天腦子也是迷迷糊糊的,所以程式碼呢,寫得有些low,也懶得改了,不過功能是實現了。 專案結構: 將原本的user表增加了兩個欄位,t

查詢資料庫某表的名和型別

mysql: 1. 查詢資料庫中的所有表:show tables; 2. 查詢表中的欄位名和欄位型別: show columns from table_name(表名);                 &n

MySQL資料庫在指定位置增加

                這個本身屬於MySQL的基本語法,我這裡給出一個例子而已。[java] view plain copy print?mysql> -- 測試資料庫在指定位置增加欄位  mysql> drop table if exists t;  Query OK, 0 rows 

資料庫查詢多個的時候,不能用物件接受

今天在做查詢從資料庫中查詢兩個欄位的問題的時候不知道是應該用物件接受,還是集合接受,開始的時候用物件接受 service層介面: User userUpdateByAccount(@Param("account") String account, @Param("phone") String phone)

python 讀取資料庫的BLOB型別,並存儲檔案到本地

import os import cx_Oracle os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' db_orcl = cx_Oracle.connect("使用者/[email protected]/orcl"

Linux 下mysql 忘記root密碼,修改密碼怎麼做?在mysql.user 並沒有password,但是有authentication_string

第一步:  vi /etc/my.cnf  在[mysqld] 下 增加 --skip-grant-tables 第二步: service mysql restart 第三步: shell>mysql  進入 控制檯 4:  &nb

Navicat修改mysql資料庫表插入資料時新增預設當前時間

比如新增createDate建立時間欄位,型別選擇timestamp,預設值填寫CURRENT_TIMESTAMP ,底部勾選欄位複選框提示根據當前時間戳更新 新插入的資料在select查詢時就會把該欄位的值查詢成最新的日期格式資料 資料查詢截圖如下

Mysql資料庫實現某一漢字轉拼音(全拼)

        (1)建立漢字拼音臨時對照表:                CREATE TABLE IF NOT EXISTS `t_base_pinyin` (                      `pin_yin_` varchar(255) CHARACTER

SQL Server資料庫查詢含有某個的表及該表記錄條數

SELECT object_name(sc.id) as TableName, sc.Name as ColumnName, si.rows as RowCounts FROM SysColumns sc LEFT JOIN SysObjects so ON sc.id =

資料庫的datatime型別 用字串的形式輸出(如05-20-2012)

SqlConnection con = new SqlConnection("server=localhost;database=bookmanage;uid=sa;pwd=1234"); con.Open(); string sql = "

資料庫使用關鍵字作為

在Oracle 中只能用雙引號"包圍關鍵字。但由於Oracle中雙引號內的字串是區分大小寫的,而不管建立表還是查詢時,Oracle都會把欄位名轉成全部大寫,所以,除非建立表時雙引號內的欄位名就是全大寫的,否則以後查詢時SQL語句都必須加雙引號,若不加則Oracle內部會把欄位名轉成全大寫從而提示“無效的識別

python讀取xml資料庫中表內所有資料,獲取資料庫所有表的名稱

工作中需要讀取指定xml資料庫中的資料以及 表所需欄位名,所以在已有例子中改進實現: xml 資料庫 xmldabase.xml: <database> <manifest> <pair key="schema_major_vsn" v

資料庫存放json的如何解析

JSONArray的格式:必須要求是以[]開始和結束的 資料庫中的資料格式是這樣的: para欄位中: [{paraName:"paraName",paraText:"最小火力",paraVal

列出MSSQL資料庫的表和內容

CREATE PROCEDURE [dbo].[List_Field] ASSELECT       表名=d.name, --case   when   a.colorder=1   then   d.name   else   ''   end,     欄位序號=a.c

mysql資料庫批量修改表的值根據關聯表資料修改

主要場景應用於A表的欄位cust_id是B表裡面的主鍵ID,根據已經A表中存有的cust_code值做關聯通步B表的cust_id儲存到A表中cust_id中,使用主鍵索引查詢提高查詢效率 UPDATE crm_cust_message_detail d SET d.cus