Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432731
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 518
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-14 12:10
个人简介

邮箱:oxwangfeng@qq.com

文章分类

全部博文(43)

文章存档

2021年(1)

2018年(7)

2017年(9)

2016年(26)

我的朋友

分类: 服务器与存储

2016-01-28 14:23:02

目前使用数据复制的时候,对数据完整性校验方面的保护措施还没有,不能判断网络传输过程中被恶意串改,异构数据复制过程中,没有验证数据完整性的保护措施。

如果可以把一行数据计算出一个唯一值,在数据行末尾增加一个字段用来存储这个唯一值,当数据变更的时候同时更新这个唯一值;在使用这个数据的时候,如果需要验证数据是否完整,可以根据这个唯一值来校验。

完整技术方案

收到新增数据请求,使用CRC32算法计算新增数据,获得一个32位的无符号整形数据,这个32位的无符号整形数据我们称之为校验KEY,将校验KEY,附加到新增数据末位的隐含列。

insert:

例如向数据库新增一行数据:INSERT INTO user(id, name, age) VALUES(1, ‘shell’, 28);

使用CRC32算法对新数据生成一个校验KEY2986321190

设置的隐含列为:_key int unsigned not null

拦截到这条SQL语句,将之重写为:INSERT INTO user(id, name, age, _key) VALUES(1, ‘shell’, 28, 2986321190);

收到数据变更的请求,同样使用CRC32算法计算新增数据,获得校验KEY,将校验KEY更新到隐含列。


UPDATE




例如向数据库更新一行数据:UPDATE user set name = ‘kate’ WHERE id = 1;

首先获得原数据行数据,1,[], 28

将新数据kate填充到[], 1kate28

计算出新的CRC32975831571

SQL语句改写为:UPDATE user set name = ‘kate’ _key =  975831571 WHERE id = 1;


效果:

在把数据从一个地方复制到另一个地方的时候,例如将数据从A复制到B,原来的方案需要把AB查询出来做比较;用了校验KEY,只需要在B用校验KEY来验证数据是否复制完整。

关键点:

       1. 使用CRC32算法生产的附加列只占用4个字节的额外存储空间。

       2. 附加列是对生产不可感知的,只用作后台数据流复制时,校验数据用。



阅读(10083) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~