콘텐츠로 이동
getnextpdf.com

신뢰된 시간: 타임스탬프는 어떻게 '언제'를 증명하는가

Spec: RFC 3161Spec: RFC 5816Spec: ISO 32000-2, §12.8.5

타임스탬프는 하나의, 의외로 미끄러운 질문에 답합니다: 이 데이터가 이미 존재했는가? 누가 만들었는지도 아니고, 그것이 올바른지도 아니라 — 오직, 어떤 명명된 순간에, 바로 이 정확한 바이트들이 이미 세상에 있었다는 것뿐입니다. 이 페이지는 그 개념을 바닥부터 쌓아 올립니다: 타임스탬프 기관이 하는 일, 토큰이 실제로 담고 있는 것, 그리고 왜 시계 위의 숫자 하나가 증거가 되는지.

이것은 엔진 중심의 Timestamps and trusted time에 대한 제일 원리 짝꿍입니다. “신뢰된 시간”이 전문 용어처럼 들린다면 이 글을 먼저 읽으십시오.

여러분 컴퓨터의 시계는 증거가 아니라 자백입니다. 여러분은 그것을 원하는 어떤 값으로든 설정할 수 있으며, 다른 누구라도 그렇게 할 수 있습니다. 어떤 날짜가 제이자에게 중요해지는 순간 — 마감 전에 서명되어야 했던 계약, 분쟁 전에 존재했어야 했던 기록 — 여러분 자신의 시계는 증거로서 가치가 없습니다. 여러분이 그것을 통제하기 때문입니다. 신뢰된 시간이라는 문제 전체는 여러분이 움직일 수 없는 시계를 찾는 것입니다.

이것은 틈새의 관심사가 아닙니다. 오래 사는 모든 서명된 PDF 가 그것에 기댑니다. 서명 인증서는 결국 만료됩니다; 몇 년 뒤, 검증자는 인증서가 여전히 유효한 동안 서명이 이루어졌는지를 알아야 합니다. “언제”에 대한 독립적인 기록이 없으면, 그 질문에는 정직한 답이 없습니다. 신뢰된 시간은 지속되는 서명이라는 건축물 전체가 의존하는 조용한 토대입니다.

  • 타임스탬프는 한 조각의 데이터가 명시된 순간 이전에 존재했음을 증명합니다. 그것은 나이에 대한 상한이며, 그 이상은 아닙니다.
  • 그것은 제삼자, 즉 **타임스탬프 기관(TSA)**이 생성하며, 여러분이 그 시계를 신뢰하는 것은 바로 그것이 여러분 것이 아니기 때문입니다.
  • TSA 는 여러분의 데이터를 결코 보지 않습니다. 그것은 데이터의 해시를 시간 값에 묶어 서명하고, 작은 서명된 토큰을 반환합니다.
  • 토큰은 세 가지를 함께 증명합니다: 데이터가 그 데이터라는 것(해시가 일치함), 시간이 TSA 의 시간이라는 것(그 서명), 그리고 응답이 여러분이 보낸 요청과 일치한다는 것(그것이 되돌려 보내는 논스로, 재생된 더 오래된 응답을 막아 줍니다).
  • 그것은 누가 데이터를 썼는지, 데이터가 참인지, 또는 생성의 정확한 순간을 증명하지 않습니다. 오직: 시점보다 늦지 않았다는 것뿐입니다.
  • 신뢰는 TSA 로 흘러갑니다. 공개적으로 신뢰되는 TSA 는 대부분의 기록에 충분합니다; eIDAS 적격 TSA 는 EU 에서 법적 추정을 동반합니다.

이 모든 것의 중심에 있는 묘책에서 시작합시다. 여러분은 낯선 사람이 언제 여러분의 데이터가 존재했는지를 보증해 주길 원하지만, 그에게 데이터를 보여 줄 수는 없습니다 — 그것은 기밀일 수 있고, 어쨌든 엄청나게 클 수 있습니다. 그래서 보여 주지 않습니다. 대신 해시를 계산합니다: 원본의 단 한 바이트만 바뀌어도 완전히 달라지고, 그것으로부터 원본을 복원할 수 없는, 짧고 고정 길이인 지문입니다. 파일이 아니라 그 지문을 보냅니다.

TSA 는 그 지문을 받아, 자신의 현재 시간을 붙이고, 자신의 개인 키로 그 쌍에 서명하여, 타임스탬프 토큰을 돌려줍니다 (Spec: RFC 3161, §2.1). 토큰은 영구화된 묶음입니다: 이 지문이, 이 시간에, 내가 보증함. 토큰이 서명되어 있기 때문에, 누구도 — 나중에 TSA 자신조차도 — 서명을 깨뜨리지 않고는 시간을 바꿀 수 없습니다. 그것이 여러분의 지문을 담고 있기 때문에, 다른 어떤 파일에도 쓸모가 없습니다. 그리고 요청이 TSA 가 바꾸지 않고 되돌려 보내는 신선한 무작위 논스를 포함하기 때문에, 여러분은 응답이 바로 이 특정 요청에 대응하며 더 오래된 응답의 재생이 아님을 알 수 있습니다 — 논스는 누가 요청했는지가 아니라 신선함을 입증합니다 (Spec: RFC 3161, §2.4.2).

접힌 편지 위에 눌러 찍은 봉랍 인장을 생각해 보십시오. 그 인장은 편지를 읽지 않습니다; 그저 인장이 찍힐 때 편지가 온전했고 그 자리에 있었음을 증명할 뿐입니다. 타임스탬프는 여러분이 소유하지 않은 시계가 여러분 데이터의 지문 위에 찍은 인장입니다.

  1. Fingerprint the dataCompute a one-way hash of the file or the signature value. The data itself never leaves your hands.
  2. Ask the authoritySend the hash and a fresh random nonce to the Time-Stamp Authority.
  3. The TSA seals a timeIt signs the hash bound to its own clock and echoes your nonce, producing a small signed token.
  4. Store the tokenFor a PDF, the token is placed inside the file so the proof travels with the document.
  5. Verify laterAnyone who trusts the TSA can check the token: its signature against the TSA certificate, the matching hash, the echoed nonce, and the time — then concludes an upper bound on age.
How a trusted timestamp is obtained and what it proves: a hash plus a fresh nonce go to the TSA, the TSA signs that hash bound to its own time and echoes the nonce, and the verifier checks every link before treating the token as proof that the data existed before the stated time.

PDF 안에서, 이 동일한 메커니즘은 두 개의 모자를 씁니다. 서명 타임스탬프는 서명의 값에 타임스탬프를 찍음으로써 서명이 적용된 시점을 봉인합니다. 문서 타임스탬프는 전체 PDF 를 해싱하여(토큰이 차지할 자리 표시자는 제외) 반환된 토큰을 그 자리 표시자에 되돌려 저장함으로써 파일 전체가 존재했던 시점을 봉인합니다 (Spec: ISO 32000-2, §12.8.5). 두 번째 종류가 오래 사는 보존용 서명이 그 신뢰를 신선하게 유지하기 위해 수년에 걸쳐 갱신하는 것입니다.

알아 둘 만한 하나의 현대적 세부 사항: 더 오래된 타임스탬프 형식은 TSA 자신의 인증서를 명명하기 위해 하나의 해시 알고리즘에 자신을 고정시켰습니다. 갱신된 프로파일은 토큰이 대신 현재의 다이제스트로 자기 인증서를 명명하도록 허용하므로 (Spec: RFC 5816, §2.1), 신뢰된 시간은 어제의 암호 기법을 조용히 물려받지 않습니다.

여러분은 토큰을 손으로 조립하지 않으며, 그러길 원해서도 안 됩니다. 이해할 가치가 있는 것은 신뢰의 이음매입니다: 여러분이 믿기로 선택하는 시계가 어느 것인지입니다. NextPDF 에서는, 신뢰된 시간을 필요로 하는 서명 레벨을 요청하는 것이 그 선택을 암묵적이 아니라 명시적으로 만듭니다.

<?php
declare(strict_types=1);
use NextPDF\Security\Signature\SignatureLevel;
// A baseline signature trusts only the signer's own clock.
$baseline = SignatureLevel::PAdES_B_B;
$baseline->requiresTimestamp(); // false → no third party vouches for "when"
// Stepping up to B-T means a Time-Stamp Authority must be supplied:
// from here on, "when" is attested by a clock you do not control.
$timestamped = SignatureLevel::PAdES_B_T;
$timestamped->requiresTimestamp(); // true → a TSA is now part of your trust model
// The decision is now visible at the call site, not buried in a default.
// Choosing the TSA is choosing whose time becomes your evidence.

이 예제의 요점은 API 가 아닙니다. 요점은 “나에게 신뢰된 시간이 있는가?”가 여러분 문서에 대한 예/아니오 사실이며, TSA 가 그 고리 안에 있었는지에 따라 결정된다는 것 — 그리고 엔진은 그 사실이 모호해지도록 내버려 두기를 거부한다는 것입니다.

함정은 타임스탬프를 *“이것은 14:32 에 생성되었다”*로 읽는 것입니다. 그것은 그런 말을 결코 하지 않습니다. 그것은 *“이것은 14:32 보다 늦지 않게 존재했다”*고 말합니다. 그 차이가 핵심 전체입니다. 타임스탬프는 상한이지, 결코 하한이 아니며 결코 정확한 순간이 아닙니다. 여러분의 데이터는 타임스탬프를 찍기까지 수년 동안 이미 존재했을 수도 있습니다; 토큰은 그에 대해 침묵합니다. 그것은 하나의 선을 긋고 말합니다: 여기보다 뒤는 아니다.

두 번째, 더 비싼 오해: 타임스탬프가 여러분 문서가 진본이거나 올바르다는 것을 증명한다는 것입니다. 그것은 둘 다 하지 않습니다. 그것은 의미에 무관심합니다. 완벽하게 타임스탬프된 거짓말은 여전히 거짓말입니다 — 다만 이제 증명 가능하게 오래된 것일 뿐입니다. 진정성은 누구인지를 말하는 서명에서 나옵니다; 진실은 세상에서 나옵니다. 타임스탬프는 언제나 오직 언제에 대해서만 말합니다.

타임스탬프의 범위는 정확히 그 신뢰 모델이 멈추는 곳에서 멈춥니다. 그것은 나이에 대한 상한을, 오직 그것만을, 그리고 오직 그것을 봉인한 기관을 여러분이 신뢰하는 경우에만 증명합니다.

구분할 가치가 있는 두 등급의 기관이 있습니다. 공개적으로 신뢰되는 TSA 는 여러분 소프트웨어가 이미 받아들이는 인증서로 이어집니다; 그 토큰은 널리 검증 가능하며 대부분의 기록에 적합합니다. eIDAS 적격 TSA 는 EU 신뢰 목록에 있는 감독 대상 제공자이며, 적격 전자 타임스탬프는 그 날짜의 정확성과 데이터의 무결성에 대한 법적 추정을 동반합니다 — 일반 타임스탬프에는 없는 추정입니다 (Spec: eIDAS, Art. 41). 그 둘 중에서 선택하는 것은 바이트가 어떻게 작동하는지가 아니라 여러분에게 필요한 증거적 무게에 대한 질문입니다; 암호 기법은 동일합니다.

타임스탬프는 또한 자기 자신의 신뢰 앵커의 수명을 물려받습니다. TSA 의 인증서는 만료되거나 폐기될 수 있고, 그것이 사용한 해시 알고리즘은 노후할 수 있습니다. 바로 그렇기 때문에 오래 사는 문서는 한 번 타임스탬프를 찍고 떠나 버리지 않습니다 — 그것들은 갱신하며, 오래된 증거가 약해지기 전에 새로운 문서 타임스탬프를 오래된 증거 위에 겹쳐 쌓습니다. 그 갱신 루프는 그 자체로 별개의 주제입니다; Long-term validation을 참고하십시오.

RFC 3161 trusted timestamping (signature and document timestamps) — edition availability
EditionAvailability
Core

PAdES B-BB-T 를 지원합니다. B-B 는 타임스탬프가 없는 기준선 서명입니다; B-T 는 여러분이 그 시계를 고르는, 배포가 제공한 TSA 에 대해 검증된 RFC 3161 서명 타임스탬프를 요청하고 임베드합니다.

Pro

B-LT 가 인증서 만료 후에도 서명을 검증 가능하게 유지하기 위해 필요로 하는, 임베드된 장기 검증 데이터(인증서, OCSP, CRL)를 추가합니다.

Enterprise

B-LTA 갱신 루프를 추가하여, 검증 데이터를 새로운 문서 타임스탬프 아래에 봉인하고 보호가 약해지기 전에 다시 스탬프를 찍습니다.

  • 타임스탬프 기관(Time-Stamp Authority, TSA) — 서명된 타임스탬프 토큰을 발급하는 독립 서비스. 여러분이 그 시계를 신뢰하는 것은 바로 그것이 여러분 것이 아니기 때문입니다.
  • 타임스탬프 토큰(Time-stamp token) — TSA 가 반환하는 작은 서명된 객체로, 여러분 데이터의 해시를 시간 값에 묶습니다 (Spec: RFC 3161, §2.1).
  • 해시(메시지 임프린트)(Hash (message imprint)) — 데이터의 짧은 일방향 지문. TSA 는 데이터 자체가 아니라 이것에 서명하므로, 여러분의 콘텐츠는 비공개로 유지됩니다.
  • 논스(Nonce) — 요청과 함께 보내고 응답에 바뀌지 않은 채 되돌려 보내는 신선한 무작위 숫자로, 토큰이 그 특정 요청에 대응하며 재생된 오래된 응답이 아님을 보여 줍니다(그것은 요청자의 신원이 아니라 신선함을 입증합니다).
  • 상한(Upper bound) — 타임스탬프가 확립하는 것: 데이터가 명시된 순간 보다 늦지 않게 존재했다는 것. 결코 정확한 생성 순간이 아닙니다.
  • eIDAS 적격 타임스탬프(eIDAS-qualified timestamp) — 날짜 정확성과 데이터 무결성에 대한 법적 추정을 동반하는, 감독 대상 EU 제공자의 타임스탬프.
  • 문서 타임스탬프(Document timestamp) — 전체 PDF 파일에 대한 타임스탬프로, 장기 검증 증거를 앵커하고 갱신하는 데 쓰입니다 (Spec: ISO 32000-2, §12.8.5).