记一次批量处理数据库中的敏感信息
前言
對于一些敏感數據,往往會對其加密后再入庫,這個是對數據安全性的一個最為簡單的措施。
最常見的莫過于手機號碼和身份證號了,相信還是有不少公司對這些敏感信息是明文存儲的。
萬一被別人發現系統漏洞,或者是被拖庫,那基本上就涼涼了。
老黃最近也是發現了公司內部一個系統有這樣的問題,剛發現的時候都嚇了我一跳,這么赤裸裸的明文手機號和身份證號。
第一反應就是要把這兩個數據進行加密處理。
既然要加密處理,那么正在使用的系統肯定就會受到影響,而且幾千萬數據,也不是幾分鐘就能搞定的。
這個系統用的數據庫是阿里云的RDS(SQL Server)。
下面簡單說一下老黃這邊的處理方案。
如何處理
整個處理的流程是分了三個步驟:
修改數據庫中的字段長度
系統要更新一個版本做兼容處理,寫入要用統一的加密方法,讀取的時候,要加一個長度判斷,當長度大于20的時候,需要進行解密操作,這樣才能確保不會把密文直接展示出去。
修改數據
之前數據庫給這兩個字段設置的長度都是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總結
設計系統的時候,數據安全還真的是不容小覷的,對一些敏感信息還是要加密入庫的。
修改數據的過程中,也涉及到了兩個知識點,數據的批量插入和批量更新。
總結
以上是生活随笔為你收集整理的记一次批量处理数据库中的敏感信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SwaggerUI看烦了,IGeekFa
- 下一篇: 配置文件中的数据库连接串加密了,你以为我