数据漂白分析

注:此文章只代表个人想法,并不代表全球的数据漂白思想。特此声明!
 
我们一直在研究如何保证企业或个人的隐私数据的安全性,我们搭建了防火墙,对前台访问数据库的限制等等。但是在 CSDN 的泄露密码事件之后,我们发现数据库中的内容并没有被加密,而是真直白的的站在开发人员和入侵的黑客面前。这使我们不得不考虑数据在公司内部的安全性,开发人员应该看到的是加密或伪造后的数据,这样才保证数据在企业内部也是安全的。而解决办法就是数据漂白。
数据漂白的作用和功能
数据漂白可以使数据更加安全,他与加密不同,数据加密时候是无法正常读取和使用的,必须解密才能使用。而漂白是将数据通过一定的算法变成另一种样式,而这种样式是可读的,并且与元数据是同一类的。
例如:“ IBM5100 ”数据加密会得到“ w%(Jt#v! ”而数据漂白会得到“ IBN7300
数据只有在漂白之后才能保证给测试人员时,没有侵害用户的个人隐私数据。并且可以通过数据漂白来创造新的数据,其增长速度是原始数据的 2 的指数幂增长。
还有就是无论怎样漂白,格式和社会习惯不能改变。也就是说,漂白后的数据必须具有高仿真度。例如:数据长度不能讲 5 位漂白至 6 位;纯数字的字符串漂白后不能出现字符;地址漂白后所在地区必须对应所在省等。
数据漂白方式
轮询:将有限的数据排成一个循环队列,将原数据的指针向前或向后移动 n 位得到新的数据。(理论上可逆)
哈希:将数据放入哈希函数中将获得的新数据覆盖原数据。(完全不可逆)
随机:重新随机一个数据,其值与原数据无关。重新创建序列也算随机的一种(不可逆)
分段处理:将数据分成 n 块,每块可以使用不同的漂白方式。(是否可逆与漂白方式有关)
数据漂白涉及到的数据类型和漂白方法
漂白数据时要考虑开发时 SQL 使用的 where 条件中是否使用要漂白的字段的值,如果使用那么需要慎重考虑是否要漂白此列数据,但涉及到的个人隐私数据除外。例如:单子的类型分为三种,数据库使用 CLASS 列控制,数据只有 A,B,C 三种,这时在 SQL 中会有 where class = 'A' 的条件。这样的数据如果漂白,那么放在生产系统上市会将每一个SQL里的where条件值修改,耗费时间和精力。
类型
数据类型
漂白方式
所需前提
个人用户隐私
姓名(中文)
将姓名分成姓和名两部分分别处理,姓可以使用百家姓的轮询算法( 注意特殊的复姓 ),名可以不变,或使用汉字的随机算法
 
地址
地址一定要使用分段处理方式,例如:原数据为北京市丰台区,如果全部随机则可能变成黑龙江大连市,表面看起来没问题但是在开发者眼中却是一个很别扭的地址并且在身份证的字段中不好控制,所以地址要分为省、直辖市,然后将对应的新省里的市进行随机抽取(个人认为需要数据表支持)
 
住址
住址可以不变(这里只是指街道、小区、楼号、单元号、户号等),如果需要漂白则可以使用随机方式,不过随机也要遵循原数据格式。
 
出生日期
出生日期由于数据类型的区别,可以将数据老化(向前增加时间,变为原日期的过去日期),或数据翻新(向后增加时间,变为原日期的未来日期)
 
身份证
身份证字段分为地区6位,生日8为,和后4为随机位,其中地区要与地址对应
完成地址漂白,完成出生日期漂白
其他证件
与身份证处理类似,如有必要也应分块处理
 
电话
固定电话分为区号和本机号和分机号,这三个除区号以外都需要分别使用随机方式。手机号分为号段3位,地区4位,随机4位。对于400800电话前三位应该予以保留不变。
完成地址漂白
银行卡
除前几位位于所在银行有关其余必须全部使用随机算法
 
密码
必须使用随机算法或哈希算法
 
网址
只需地址哈希即可,域名并不需要漂白
 
邮政编码
邮政编码只需要根据漂白后的地址所对应的邮编覆盖即可
完成地址漂白
车牌号
简称与地址要相同,其余使用哈希
完成地址漂白
保险行业
单号
单号若为纯数字形式,并且无规则可以使用同长度的序列,若有特殊要求则将特殊需求通过分块单独处理,其余使用随机方式。若有某些字母,因其字母会有一部分含义所以字母应该使用轮询算法,数字处理参照纯数字单号。
 
险类
险类的代码若为纯数字则可以使用随机,位数少的可以使用轮询。其对应的险类名称可以再次分配或根据生成的新的险类代码对应的险类名称覆盖。
 
险种
由于险种是基于险类的,所以险种的一部分可能重新与险类对应,后半部分可以随机生成,险种名称与险种代码对应关系参考险类
完成险类漂白
其他
列名
个人认为列名不应当漂白,因为开发人员有时会根据列名来寻找想要的内容,如果列名被漂白,则上生产库时要将列名修改回原值,会耗费很多时间和精力。所以个人认为完全没有必要。
 
 
具体实施细节
中文的处理:中文处理可以使用 汉字编码位移算法 (参见 C#汉字编码位移算法 。特别是公司名称和个人的名。这样既保证了漂白后的长度一致,又可将元数据隐藏。
英文字符的处理:英文字符同样也可使用中文处理方法,将每一个字母位移。也可完全随机抽取。
数字的处理:特殊数字特殊处理,其他的可以使用同等长度的序列来代替
日期:可分别对年月日进行漂白
轮询的处理:轮询的差值如果位固定的某个值则可能和不安全。所以应该使用随机差值进行轮询。
凯撒加密算法 :具体作用还未想出来
地址的处理 :对于地址不论是否规格都应当 规格化 之后再进行漂白。
姓名的处理:由于姓名中文有单姓和复姓之分,但是数据漂白时完全可以忽略这些,因为我们只希望测试人员看到的是比较舒服的人名,而不是考虑他们是否是单姓还是复姓问题。所以姓名的“姓”完全可以使用常用姓来代替。这样即提高了转化效率又可以使测试人员看着舒服。对于 4 字姓名可以转化为三字的姓名。
个人认为可能用到的临时表
1 、省市自治区、直辖市表
2 、随机数表(数据全部漂白完成后要将随机值列的数值清空
列名
随机值
产生日期
姓名
5
2012-08-15
 
 
 
3 、身份证前 6 位与地址对应关系表
4 、常用姓氏表

附录

C#汉字编码位移算法

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Example019
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
char chr = textBox1.Text[0]; // 获得一个汉字字符
byte[] gb2312_bt = Encoding.GetEncoding("gb2312").GetBytes(new Char[] { chr }); // 使用 gb2312 编码方式获得字节序列
int n = (int)gb2312_bt[0] << 8; // 将字节序列的第一个字节向左移 8
n += (int)gb2312_bt[1]; // 第一字节左移 8 位后 第二字节相加 得到 汉字编码
textBox2.Text = n.ToString(); // 显示汉字编码
}
catch (Exception)
{
MessageBox.Show(" 请输入汉字字符! ", " 出现错误 ");
}
}
private void Form1_Shown(object sender, EventArgs e)
{
this.Text = " 获取汉字编码值 ";
}
}
}
 
源文档 < http://www.cnblogs.com/andy-xsd/archive/2011/10/17/2214495.html >

中文地址规格化

简要叙述
中文地址由于长度不一致所以定位读取是很困难的事情,所以我们可以按照由于省份的结尾都是“省”(直辖市除外)省下面的城市都已“市”结尾。所以以这两个字作为区分就会变得轻松许多。但是日常生活中人们很容易省略“省”和“市”,例如黑龙江哈尔滨,黑龙江哈尔滨市等这样就很难判断阶段的位置了。所以为了以后对地址处理方便我们就要将其规格化。
规格化思想
规格化的思想很简单,就是我们已知省份的名称,那么我们只查询“ XXX 省”的“ XXX ”并强制在其后面加入“省”。但是这样原来有“省”字的,就会变成“省省”。然后我们将这类的字替换为一个省字即可。
例如:吉林,黑龙江,辽宁省,上海市,福建省
第一步强制添加省:吉林省,黑龙江省,辽宁省省,上海市,福建省省
第二步将省省替换成省:吉林省,黑龙江省,辽宁省,上海市,福建省
城市的处理是一样的。只不过有所在省的限制条件而已。
执行代码
SQL
-- 第一步强制添加省(此PLSQL有错误)
DECLARE
    CURSOR V_STATE
    IS
        SELECT distinct REGEXP_REPLACE(STATE, ' ')
        FROM CITY
        WHERE STATE LIKE '% ';
    P_STATE CITY.STATE%TYPE;
BEGIN
    FOR P_STATE IN V_STATE
    LOOP
        
        SET ADDRESS =
            (
                SELECT REGEXP_REPLACE(ADDRESS, P_STATE, P_STATE||' ')
                FROM CITY_TEST C2
                WHERE C1.ADDRESS = C2.ADDRESS
                GROUP BY REGEXP_REPLACE(ADDRESS, P_STATE, P_STATE||' ')
            );
    END LOOP;
END;
-- 第二步将省省替换成省
UPDATE CITY_TEST C1
SET ADDRESS =
            (
                SELECT REGEXP_REPLACE(ADDRESS, ' 省省 ', ' ')
                FROM CITY_TEST C2
                WHERE C1.ADDRESS = C2.ADDRESS
                GROUP BY REGEXP_REPLACE(ADDRESS, ' 省省 ', ' ') );
C
C#
JAVA

你可能感兴趣的:(数据漂白,数据脱敏)