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