天天看點

記一次批量處理資料庫中的敏感資訊

記一次批量處理資料庫中的敏感資訊

前言

對于一些敏感資料,往往會對其加密後再入庫,這個是對資料安全性的一個最為簡單的措施。

最常見的莫過于手機号碼和身份證号了,相信還是有不少公司對這些敏感資訊是明文存儲的。

萬一被别人發現系統漏洞,或者是被拖庫,那基本上就涼涼了。

老黃最近也是發現了公司内部一個系統有這樣的問題,剛發現的時候都吓了我一跳,這麼赤裸裸的明文手機号和身份證号。

第一反應就是要把這兩個資料進行加密處理。

既然要加密處理,那麼正在使用的系統肯定就會受到影響,而且幾千萬資料,也不是幾分鐘就能搞定的。

這個系統用的資料庫是阿裡雲的RDS(SQL Server)。

下面簡單說一下老黃這邊的處理方案。

如何處理

整個處理的流程是分了三個步驟:

  1. 修改資料庫中的字段長度
  2. 系統要更新一個版本做相容處理,寫入要用統一的加密方法,讀取的時候,要加一個長度判斷,當長度大于20的時候,需要進行解密操作,這樣才能確定不會把密文直接展示出去。
  3. 修改資料

之前資料庫給這兩個字段設定的長度都是20,現在統一調整成150。

公司内部已經統一了一套加解密方法了,是以系統調整這一塊是比較簡單的,統一在資料層處理。

剩下的就是去資料庫改資料了。

統一的加密方法,在資料庫中沒有辦法直接使用,是以隻能單獨寫個程式去處理。

改資料也細分為下面3步。

  1. 讀取源資料,加密相關字段
  2. 将加密的資料寫入到一張臨時表中
  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           

總結

設計系統的時候,資料安全還真的是不容小觑的,對一些敏感資訊還是要加密入庫的。

修改資料的過程中,也涉及到了兩個知識點,資料的批量插入和批量更新。

本文首發于我的個人公衆号 不才老黃 ,不定期釋出一些内容,有興趣的可以關注一下喲!

記一次批量處理資料庫中的敏感資訊
記一次批量處理資料庫中的敏感資訊

如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!

作者:Catcher Wong ( 黃文清 )

來源:http://catcher1994.cnblogs.com/

聲明:

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。

繼續閱讀