为服务的最终用户提供伪造数据保护工具?

问题描述 投票:3回答:1

我需要创建一个服务,但我需要一个帮助选择工具。

想象一下用户创建一些在历史视图中具有价值的数据(例如交易)的服务。其他用户可以看到这些数据,但他们需要证明数据是真实的,而不是被用户甚至服务伪造。

例:

  1. 用户A创建编号为42的记录
  2. 几个月过去了
  3. 用户B看到此记录,并希望确保该服务无法使用任何其他号码更新此记录37

服务有24小时的信任窗口:它甚至可以更改当天制作的用户数据。

问题:哪些工具可以帮助我实现这一目标?


我在考虑做任何用户可以下载的公共日常备份(或报告?)。从每个报告哈希将被计算并插入到下一个备份中 - 因此,创建了一个哈希变换。如果服务将改变过去的某些东西,那么此链中的哈希将不会收敛。当然,我将创建开源工具,以便于比较数据之间的差异并检查链是否有效。

信任点:有一件事我害怕。服务可以同时使用多个数据库并使用所有哈希值更新所有备份(因为第一个备份没有前一个备份的哈希值)。因此,为了涵盖这种情况,我想在某些地方存储哈希,服务根本无法改变。例如,来自官方服务钱包的现有区块链(btc,eth,...)之一。或者,也许,DAG有一些像IOTA这样的区块链?


  1. 您如何看待信任点?
  2. 我能用一些更简单的方法(没有区块链)实现我的目标吗?哪一个?
  3. 这个逻辑中有哪些瓶颈?
database hash blockchain database-backups
1个回答
1
投票

这里有2个参与变量

  1. 创建记录的时间戳。
  2. 数据。

解决方案前提,

  1. 篡改证据。
  2. 数据可以在同一GMT日历日更改,而不会违反防篡改保证。 (创建后可以更改为固定窗口)
  3. RDBMS作为数据存储,(可以更改为任何具有次要mod的NoSQL,但想法保持不变)。
  4. 不依赖于任何其他可能有故障或容易出错的机制。
  5. 单一查询验证。

##建议的解决方案

create data table

CREATE TABLE TEST(
ID INT PRIMARY KEY AUTO_INCREMENT,
DATA VARCHAR(64) NOT NULL,
CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP()
); 

create checksum table, which monitor tempering

CREATE TABLE SIGN(
ID INT PRIMARY KEY AUTO_INCREMENT,
DATA_ID INT NOT NULL,
SIGNATURE  VARCHAR(128) NOT NULL,
CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP(),
UPDATED_AT TIMESTAMP
);

create trigger on insert of data

/** Trigger on insert */
DELIMITER //
CREATE TRIGGER sign_after_insert
AFTER INSERT 
ON TEST FOR EACH ROW
BEGIN 
-- INSERT VAL 
INSERT INTO SIGN(DATA_ID, `SIGNATURE`) VALUES(
NEW.ID, MD5(CONCAT (NEW.DATA, DATE(NEW.CREATED_AT)))
);
END; //
DELIMITER ;

Create a trigger for update of data

-- UPDATE TRIGGER
DELIMITER //
CREATE TRIGGER SIGN_AFTER_UPDATE
AFTER UPDATE 
ON TEST FOR EACH ROW
BEGIN 
-- UPDATE VALS
IF (NEW.DATA <> OLD.DATA) AND (DATE(OLD.CREATED_AT) = CURRENT_DATE() ) THEN
UPDATE SIGN SET SIGNATURE=MD5(CONCAT(NEW.DATA, DATE(NEW.CREATED_AT))) WHERE DATA_ID=OLD.ID;
END IF;
END; //
DELIMITER ;

测试

Step 1: insert the data

INSERT INTO TEST(DATA) VALUES ('DATA2');

数据的签名及其创建日期将反映为SIGN表中的签名。

Step 2: update the data

如果值已更改且签名将相同,则签名将更新。

UPDATE TEST SET DATA='DATA' WHERE ID =1;

Step 3: validate

您始终可以将数据签名验证为

SELECT MD5(CONCAT (T.DATA, DATE(T.`CREATED_AT`))) AS CHECKSUM, S.SIGNATURE FROM TEST AS T ,SIGN AS S WHERE S.DATA_ID= T.ID AND S.`id`=1;

Output

| CHECKSUM |签名| | ------ | ------ | | 2bba70178abdafc5915ba0b5061597fa | 2bba70178abdafc5915ba0b5061597fa

© www.soinside.com 2019 - 2024. All rights reserved.