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

前言

对于一些敏感数据,往往会对其加密后再入库,这个是对数据安全性的一个最为简单的措施。

最常见的莫过于手机号码和身份证号了,相信还是有不少公司对这些敏感信息是明文存储的。

万一被别人发现系统漏洞,或者是被拖库,那基本上就凉凉了。

老黄最近也是发现了公司内部一个系统有这样的问题,刚发现的时候都吓了我一跳,这么赤裸裸的明文手机号和身份证号。

第一反应就是要把这两个数据进行加密处理。

既然要加密处理,那么正在使用的系统肯定就会受到影响,而且几千万数据,也不是几分钟就能搞定的。

这个系统用的数据库是阿里云的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

总结

设计系统的时候,数据安全还真的是不容小觑的,对一些敏感信息还是要加密入库的。

修改数据的过程中,也涉及到了两个知识点,数据的批量插入批量更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-50 畅通工程之局部最小花费问题 (35 分)(思路加详解)来呀兄弟们冲呀呀呀呀呀呀呀

一&#xff1a;题目 某地区经过对城镇交通状况的调查&#xff0c;得到现有城镇间快速道路的统计数据&#xff0c;并提出“畅通工程”的目标&#xff1a;使整个地区任何两个城镇间都可以实现快速交通&#xff08;但不一定有直接的快速道路相连&#xff0c;只要互相间接通过快速…

十多位全球技术专家,为你献上近十个小时的.Net微服务介绍

.Net Conf: Focus on Microservices 是 .Net Conf 社区在 2020 年 7 月 30 日举办的线上分享活动。整个活动视频长达近 10 个小时。今天我们来看看都发生了什么。章节汇总本次分享由十多位来自全球的资深技术专家在线分享&#xff0c;涵盖了当前 .Net 在微服务领域的利器。包括…

5G发展是绵绵秋雨 应循序渐进

现阶段5G技术成熟度有待提升当下&#xff0c;在行业内5G基站的短板被调侃为“覆盖、成本、功耗三个3”&#xff0c;也就是3倍成本&#xff0c;3倍功耗、1/3覆盖。就功耗来说&#xff0c;5G基站是4G基站功耗的3倍左右。中国移动董事长杨杰就在GTI国际产业峰会表示&#xff0c;“…

7-52 两个有序链表序列的交集 (20 分)(思路加详解尾插法)come Boby!

一&#xff1a;题目 已知两个非降序链表序列S1与S2&#xff0c;设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行&#xff0c;分别在每行给出由若干个正整数构成的非降序序列&#xff0c;用−1表示序列的结尾&#xff08;−1不属于这个序列&#xff09;。数字用空…

明源云创CI/CD技术演进

源宝导读&#xff1a;在敏捷迭代的过程中需要能够快速的把开发的代码集成打包部署到各个环节对应的环境中。为了高效稳定的完成这个工作&#xff0c;我们引入了DevOps实践理论&#xff0c;并形成了配套的CI/CD工具。本文将介绍云创的CI/CD工具如何演进的过程。一 、传统构建在最…

7-51 两个有序链表序列的合并 (20 分)(vector做法)

一 &#xff1a;题目 、已知两个非降序链表序列S1与S2&#xff0c;设计函数构造出S1与S2合并后的新的非降序链表S3。 输入格式: 输入分两行&#xff0c;分别在每行给出由若干个正整数构成的非降序序列&#xff0c;用−1表示序列的结尾&#xff08;−1不属于这个序列&#xff…

linux qt4卸载,linux卸载QT4和安装QT5的方法

由于项目中需要用到QT的程序&#xff0c;因此安装QT5的软件支持库和QT开发环境是必须的&#xff1a;apt-get insatall qt5-defaultapt-get insatall qt-creatorQT5的库和QT Creator开发环境是独立运行的&#xff0c;如果QT Creator缺少QT5的库则程序写好了没法编译&#xff1b;…

7-53 两个有序序列的中位数 (25 分)(思路加详解)用STL容器中的set容器的自动去重过不去

一&#xff1a;题目 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A 0 ​ ,A 1 ​ ,⋯,A N−1 ​ 的中位数指A (N−1)/2 ​ 的值,即第⌊(N1)/2⌋个数&#xff08;A 0 ​ 为第1个数&#xff09;。 输入格式: 输入分三行。第一行给出序列的公共长…

Blazor带我重玩前端(五)

概述本文主要讨论Blazor事件内容&#xff0c;由于blazor事件部分很多&#xff0c;所以会分成上下两篇&#xff0c;本文为第一篇&#xff0c;后续会有第二篇。我们可以视组件是一个类&#xff0c;我们先看一下前文所说的Index.Razor页面生成的C#代码。在此&#xff0c;先补充一下…

关于TensorFlow开发者证书,你想要的资源都在这里!

今天是TensorFlow开发者证书的一个里程碑&#xff0c;全球已经有500位开发者通过考试并顺利拿到了 TensorFlow Certificate。我也有幸在各位大佬的指点下&#xff0c;顺利通过考试&#xff0c;成为国内第7位拿到 TensorFlow Certificate 的开发者。按照Google官网的数据&#…

Kubernetes 在知名互联网公司的(dotnet)落地实践

容器化背景本来生活网&#xff08;benlai.com&#xff09;是一家生鲜电商平台&#xff0c;公司很早就停止了烧钱模式&#xff0c;开始追求盈利。既然要把利润最大化&#xff0c;那就要开源节流&#xff0c;作为技术可以在省钱的方面想想办法。我们的生产环境是由 IDC 机房的 10…

Java银行开户,取钱,存钱,查询余额,退出。。。。。

一&#xff1a;上码 package com.wyj.two;import java.util.Scanner;/*** 封装的练习*/ public class Demo8 {public static void main(String[] args) {Scanner in new Scanner(System.in);Account account new Account();System.out.println("欢迎来到杰哥银行"…

linux开发亿连手机互联,亿连手机互联车载版下载-亿连手机互联车机版v6.6.1 安卓版-腾牛安卓网...

亿连手机互联车机版&#xff0c;交互一体&#xff0c;手机-导航仪应用深度融合&#xff1b;升级服务&#xff0c;依托手机OTA升级导航仪应用&#xff1b;流畅连接&#xff0c;双通道互联技术连接更流畅&#xff1b;全新界面&#xff0c;配合前装和后装专业市场&#xff1b;为您…

7-3 树的同构 (25 分)(思路加详解)来呀baby!!!!!!!!

一&#xff1a;题目 7-3 树的同构 (25 分) 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G的左右孩子互换后&#xff0c;就得到另外一棵树…

Dapr微服务应用开发系列0:概述

题记&#xff1a;Dapr是什么&#xff0c;Dapr包含什么&#xff0c;为什么要用Dapr。Dapr是什么Dapr&#xff08;Distributed Application Runtime&#xff09;&#xff0c;是微软Azure内部创新孵化团队的一个开源项目&#xff0c;皆在解决微服务应用开发过程的一些共性问题。以…

你以为.NET Core仅仅是开源跨平台?试试Docker,刷新你的认知!

2016 年微软发布了 .NET Core 1.0&#xff0c;可谓是平地起惊雷&#xff0c;因为微软终于开源和跨平台了。但是一直到19年12月份发布了.NET Core3.1&#xff0c;开源社区的威力才展现出来&#xff0c;3个月增加了100w开发者&#xff0c;才真正吸引大厂的关注。但你以为仅仅是因…

7-2 一元多项式的乘法与加法运算 (20 分)(思路加详解+map做法)map真香啊 各个测试点的用例子 来吧宝贝!

一&#xff1a;题目 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行&#xff0c;每行分别先给出多项式非零项的个数&#xff0c;再以指数递降方式输入一个多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 输…

Azure认知服务之表单识别器

认知服务Azure 认知服务的目标是帮助开发人员创建可以看、听、说、理解甚至开始推理的应用程序。Azure 认知服务中的服务目录可分为五大主要支柱类别&#xff1a;视觉、语音、语言、Web 搜索和决策。开发人员使用 Azure 认知服务能够轻松地将认知功能添加到其应用程序中。Azure…

配置文件中的数据库连接串加密了,你以为我就挖不出来吗?

一&#xff1a;背景1. 讲故事前几天在调试物联柜终端上的一个bug时发现 app.config 中的数据库连接串是加密的&#xff0c;因为调试中要切换数据库&#xff0c;我需要将密文放到专门的小工具上解密&#xff0c;改完连接串上的数据库名&#xff0c;还得再加密贴到 app.config 中…

基于.NetCore3.1系列 —— 日志记录之自定义日志组件

前言回顾&#xff1a;日志记录之日志核心要素揭秘在上一篇中&#xff0c;我们通过学习了解在.net core 中内置的日志记录中的几大核心要素&#xff0c;在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器(ILoggerProvider)对象都可以集成到Logger对象组合中&#xff0c;这…