日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

记一次批量处理数据库中的敏感信息

發布時間:2023/12/4 数据库 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次批量处理数据库中的敏感信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

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

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

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

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

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

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

這個系統用的數據庫是阿里云的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

    總結

    設計系統的時候,數據安全還真的是不容小覷的,對一些敏感信息還是要加密入庫的。

    修改數據的過程中,也涉及到了兩個知識點,數據的批量插入批量更新

    總結

    以上是生活随笔為你收集整理的记一次批量处理数据库中的敏感信息的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。