RFC3161タイムスタンプとSHA-256ハッシュを、ProofMarkのサーバーを一切使わずに独立検証するツールです。
proofmark.jp で発行されたデジタル存在証明(RFC3161準拠)を、 OpenSSLとPython標準ライブラリのみでローカル検証します。
ProofMarkが発行する証明書は、ProofMarkのサーバーに依存しない設計になっています。
タイムスタンプは ProofMark ではなく 第三者の時刻認証局(TSA) が署名しています。 つまり、ProofMarkがサービスを終了しても、手元の証明書と原画ファイルさえあれば、 このツールを使って暗号学的な有効性を証明できます。
原画ファイル ──SHA-256──▶ ハッシュ値 ──RFC3161──▶ タイムスタンプ(TSA署名)
↑ ↑
└── verify.py が両方を独立検証 ───────────────────────────┘
このツールは以下の 2点 を暗号学的に検証します。
| 検証項目 | 内容 |
|---|---|
| SHA-256ハッシュ同一性 | 対象ファイルが証明時点から改ざんされていないこと |
| RFC3161タイムスタンプ有効性 | TSA(時刻認証局)による署名が有効であること |
このツールでは証明できないこと: 著作権の帰属・芸術的独自性・法的権利の最終判定。 詳細は ProofMark Trust Center を参照してください。
- Python 3.8以上
- OpenSSL(コマンドラインツール)
# バージョン確認
python --version # Python 3.8.0 以上
openssl version # OpenSSL 1.1.1 以上推奨OpenSSLのインストール方法:
# macOS (Homebrew)
brew install openssl
# Ubuntu / Debian
sudo apt-get install openssl
# Windows
# https://slproweb.com/products/Win32OpenSSL.html からインストーラーを取得python verify.py <ファイルパス> <SHA-256ハッシュ値> <Base64エンコードされたTST>ProofMarkが発行するPDF証明書には以下の情報が含まれています:
SHA-256 Hash : a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2
TST (Base64) : MIID4AYJKoZIhvcNAQcCoIID0TCCA80CAQMxDTAL...(長い文字列)
これらをコピーして以下のように実行します:
python verify.py artwork.png \
a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2 \
MIID4AYJKoZIhvcNAQcCoIID0TCCA80CAQMxDTA...ProofMark Verification Tool
https://github.com/proofmark-jp/proofmark-verify
[INFO] TSA証明書を取得中: https://freetsa.org/files/cacert.pem
── SHA-256 Hash Verification ──────────────────────────────
File : artwork.png (2,458,621 bytes)
Expected: a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2
Computed: a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2
Result : ✓ PASS
───────────────────────────────────────────────────────────
── RFC3161 Timestamp Verification ─────────────────────────
TST size : 1842 bytes
OpenSSL : Verification: OK
Result : ✓ PASS
───────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════
SUCCESS: デジタル存在証明は完全に有効です。
このファイルは、タイムスタンプが示す日時において、
現在と同一の状態で存在していたことが暗号学的に証明されました。
══════════════════════════════════════════════════════════
このスクリプトに依存したくない場合、OpenSSLコマンドを直接実行できます:
# Step 1: TSTをバイナリに変換
echo "<tst_base64>" | base64 -d > proof.tsr
# Step 2: TSA証明書を取得
curl -O https://freetsa.org/files/cacert.pem
curl -O https://freetsa.org/files/tsa.crt
# Step 3: 検証
openssl ts -verify \
-in proof.tsr \
-digest <sha256_hash_hex> \
-CAfile cacert.pem \
-untrusted tsa.crt
# 出力: Verification: OKこのコマンドはProofMarkのコードを一切使用していません。
| 項目 | 仕様 |
|---|---|
| ハッシュ関数 | SHA-256(NIST FIPS 180-4) |
| タイムスタンプ規格 | RFC3161(Internet X.509 PKI Time-Stamp Protocol) |
| TSA(現在) | FreeTSA.org(テスト・ベータ用途) |
| TSA(本番予定) | DigiCert / GlobalSign / セイコーソリューションズ |
| タイムスタンプ形式 | DER-encoded CMS SignedData(base64) |
TimeStampToken ::= ContentInfo {
content : SignedData {
encapContent : TSTInfo {
messageImprint : { SHA-256, hash_of_file },
genTime : GeneralizedTime, -- 証明された時刻
nonce : INTEGER, -- リプレイ攻撃防止
},
signerInfo : { TSA_cert_chain, RSA_signature }
}
}詳細なアーキテクチャ解説は ProofMark Trust Center を参照。
Beta版では FreeTSA.org を使用しています。
FreeTSA.orgはRFC3161準拠の無料TSAですが、以下の制限があります:
- 正式なSLAなし
- ルートCAが主要OSのトラストストアに未収録
有料プランのリリース前に、DigiCertまたはGlobalSignへ移行予定です。 既存のTSTは移行後も暗号学的に有効なまま維持されます。
MIT License — 詳細は LICENSE を参照。
このスクリプトは自由に使用・改変・再配布できます。
- ProofMark — AI生成作品のデジタル存在証明サービス
- Trust Center — 技術アーキテクチャの完全解説
- RFC3161 仕様書 — IETF公式ドキュメント
- FreeTSA.org — 現在使用中のTSA
- @ProofMark_jp — 公式X(Twitter)
ProofMark Engineering — proofmark.jp