一种数据一致性校验的方法
发表于2016-10-29
目前使用数据复制的时候,对数据完整性校验方面的保护措施还没有,不能判断网络传输过程中被恶意串改,异构数据复制过程中,没有验证数据完整性的保护措施。
如果可以把一行数据计算出一个唯一值,在数据行末尾增加一个字段用来存储这个唯一值,当数据变更的时候同时更新这个唯一值;在使用这个数据的时候,如果需要验证数据是否完整,可以根据这个唯一值来校验。
完整技术方案
收到新增数据请求,使用CRC32算法计算新增数据,获得一个32位的无符号整形数据,这个32位的无符号整形数据我们称之为校验KEY,将校验KEY,附加到新增数据末位的隐含列。
insert:
例如向数据库新增一行数据:INSERT INTO user(id, name, age) VALUES(1, ‘shell’, 28);
使用CRC32算法对新数据生成一个校验KEY:2986321190
设置的隐含列为:_key int unsigned not null
拦截到这条SQL语句,将之重写为:INSERT INTO user(id, name, age, _key) VALUES(1, ‘shell’, 28, 2986321190);
收到数据变更的请求,同样使用CRC32算法计算新增数据,获得校验KEY,将校验KEY更新到隐含列。
例如向数据库更新一行数据:UPDATE user set name = ‘kate’ WHERE id = 1;
首先获得原数据行数据,1,[], 28
将新数据kate填充到[], 1kate28
计算出新的CRC32:975831571
将SQL语句改写为:UPDATE user set name = ‘kate’, _key = 975831571 WHERE id = 1;
效果:
在把数据从一个地方复制到另一个地方的时候,例如将数据从A复制到B,原来的方案需要把A和B查询出来做比较;用了校验KEY,只需要在B用校验KEY来验证数据是否复制完整。
关键点:
1、使用CRC32算法生产的附加列只占用4个字节的额外存储空间。
2、附加列是对生产不可感知的,只用作后台数据流复制时,校验数据用。