Skip to content

proofmark-jp/proofmark-verify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

ProofMark Verification Tool

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証明書からの値の取得方法

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を直接使って検証する(上級者向け)

このスクリプトに依存したくない場合、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)

RFC3161 Time-Stamp Token の構造

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 を参照。


現在使用中のTSAについて

Beta版では FreeTSA.org を使用しています。

FreeTSA.orgはRFC3161準拠の無料TSAですが、以下の制限があります:

  • 正式なSLAなし
  • ルートCAが主要OSのトラストストアに未収録

有料プランのリリース前に、DigiCertまたはGlobalSignへ移行予定です。 既存のTSTは移行後も暗号学的に有効なまま維持されます。


ライセンス

MIT License — 詳細は LICENSE を参照。

このスクリプトは自由に使用・改変・再配布できます。


関連リンク


ProofMark Engineering — proofmark.jp

Releases

No releases published

Packages

 
 
 

Contributors

Languages