您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何批量處理數據庫中的敏感信息,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
對于一些敏感數據,往往會對其加密后再入庫,這個是對數據安全性的一個最為簡單的措施。
最常見的莫過于手機號碼和身份證號了,相信還是有不少公司對這些敏感信息是明文存儲的。
萬一被別人發現系統漏洞,或者是被拖庫,那基本上就涼涼了。
老黃最近也是發現了公司內部一個系統有這樣的問題,剛發現的時候都嚇了我一跳,這么赤裸裸的明文手機號和身份證號。
第一反應就是要把這兩個數據進行加密處理。
既然要加密處理,那么正在使用的系統肯定就會受到影響,而且幾千萬數據,也不是幾分鐘就能搞定的。
這個系統用的數據庫是阿里云的RDS(SQL Server)。
下面簡單說一下老黃這邊的處理方案。
整個處理的流程是分了三個步驟:
之前數據庫給這兩個字段設置的長度都是20,現在統一調整成150。
公司內部已經統一了一套加解密方法了,所以系統調整這一塊是比較簡單的,統一在數據層處理。
剩下的就是去數據庫改數據了。
統一的加密方法,在數據庫中沒有辦法直接使用,所以只能單獨寫個程序去處理。
改數據也細分為下面3步。
這里的最為核心的一個就是批量寫入和批量更新。如果一條條更新,那不知道要等多久才能全部處理完。
先是寫一個控制臺程序,根據Id分批次,把加密好的數據,以五千條一次寫入的頻率,一百萬數據當成一個批次。
var flag = true;
var begin = 0;
var tmpEnd = begin + 5000;
var end = 1000000;
while (flag)
{
// 省略讀取數據
foreach (var item in list)
{
DataRow dr = dt.NewRow();
dr["Id"] = item.Id;
dr["IDCard"] = GetEncryptValue(item.IDCard ?? "");
dr["PhoneNo"] = GetEncryptValue(item.PhoneNo ?? "");
dr["IDCardRaw"] = item.IDCard ?? "";
dr["PhoneNoRaw"] = item.PhoneNo ?? "";
dt.Rows.Add(dr);
}
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
bulkCopy.DestinationTableName = "enc_tmp";
bulkCopy.BatchSize = dt.Rows.Count;
bulkCopy.WriteToServer(dt);
}
begin = tmpEnd;
tmpEnd += 5000;
if (tmpEnd >= end || list == null || !list.Any())
{
flag = false;
}
Console.WriteLine(begin);
}
為保證寫入的速度,先不要在那個臨時表建索引,等數據寫進去后再給Id建索引。
把數據寫進臨時表后,下面就是直接用SQL腳本來批量更新了。
-- 建索引
create index idx_enc_tmp_id on enc_tmp (id)
-- 批量更新
update dbo.yourtable
set PhoneNo= a.PhoneNo, IDCard = a.IDCard
from dbo.yourtable b
inner join dbo.enc_tmp a
on a.id=b.id
-- 這里更新要看數據庫的配置,如果配置高,可以一次更新,不然就建議25萬或50萬一個批次
-- where a.id >= 0 and a.id <= 500000
-- 查詢校驗一下
SELECT top 100 [id]
,[IDCard]
,[PhoneNo]
FROM dbo.yourtable WITH (NOLOCK)
where id > 0 and id <= 500000
order by id asc
-- 清除臨時表的數據
truncate table dbo.enc_tmp
-- 刪除索引
drop index idx_enc_tmp_id on enc_tmp
設計系統的時候,數據安全還真的是不容小覷的,對一些敏感信息還是要加密入庫的。
修改數據的過程中,也涉及到了兩個知識點,數據的批量插入和批量更新。
上述內容就是如何批量處理數據庫中的敏感信息,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。