Здесь есть 2 участвующие переменные
- отметка времени, в которую создается запись.
- данные.
Раствор предпосылки,
- Доказательство взлома.
- данные могут быть изменены в тот же календарный день по Гринвичу без нарушения гарантии защиты от несанкционированного доступа. (может быть изменено на фиксированное окно после создания)
- СУБД как хранилище данных (можно изменить на любой NoSQL с незначительными модами, но идея остается прежней).
- Не зависит от какого-либо другого механизма, который может быть неисправен или подвержен ошибкам.
- Проверка одного запроса.
## Предлагаемое решение
создать таблицу данных
CREATE TABLE TEST(
ID INT PRIMARY KEY AUTO_INCREMENT,
DATA VARCHAR(64) NOT NULL,
CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP()
);
создать таблицу контрольных сумм, которая контролирует отпуск
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
);
создать триггер при вставке данных
/** 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 ;
Создать триггер для обновления данных
-- 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 ;
Test
Шаг 1: вставить данные
INSERT INTO TEST(DATA) VALUES ('DATA2');
Подпись данных и дата их создания будут отражены в качестве подписи в таблице SIGN
.
Шаг 2: обновить данные
подпись будет обновлена, если значение будет изменено, и это ЖЕ ДЕНЬ .
UPDATE TEST SET DATA='DATA' WHERE ID =1;
Шаг 3: проверка
вы всегда можете проверить подпись данных как
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;
выход
| ПРОВЕРКА | ПОДПИСЬ |
| ------ | ------ |
| 2bba70178abdafc5915ba0b5061597fa | 2bba70178abdafc5915ba0b5061597fa