信頼の実装、公開鍵暗号は秘密鍵の管理が肝です。秘密鍵を漏洩させない運用が重要ですが、もし漏洩して危殆化(きたいか、他人によって使用され得る状態になること)しても過去の契約書を捏造できないようにしたいですね。
「trustday」
一つの実現方法は、信頼できるタイムスタンプです。trustdayサービスは、毎日変わる秘密鍵を使って電子署名するサービスです。日付に対応する公開鍵を公開しているので、署名した日で検証が可能で、秘密鍵は破棄するため過去の日付を捏造することができません。
安全なハードウェアでサービスを立ち上げ、下記のコードで署名します。
import { fetchCBOR } from "https://js.sabae.cc/fetchCBOR.js";
const url = "http://localhost:8000/api/";
const data = new Uint8Array([1, 2, 3]);
const sign = await fetchCBOR(url, data);
console.log(sign);
日付で公開鍵を取得し、sec.jsを使って、検証できます。
import { fetchBin } from "https://js.sabae.cc/fetchBin.js";
import { Day, TimeZone } from "https://js.sabae.cc/DateTime.js";
import * as sec from "https://code4fukui.github.io/sec.js/sec.js";
// set sign, data
const day = new Day(TimeZone.JST).toString();
const url2 = "http://localhost:8000/" + day + ".pubkey";
const pubkey = await fetchBin(url2);
const b = sec.verify(sign, pubkey, data);
console.log("verify", b);
唯一のサービスとして動かしてしまうと弱いため、一人ひとりが日付証明サービスを持ち、互いに利用し合う、自律分散型にするのもいいですね。