Bỏ qua để đến nội dung
getnextpdf.com

Enterprise phiên bản

Evidence — Tài liệu tham chiếu chuyên sâu

Trang này là tài liệu tham chiếu chuyên sâu cho module NextPDF\Enterprise\Evidence. Module niêm phong các phát hiện kiểm định vào một EvidencePackage bất biến, xuất nó ra dưới dạng JSON xác định với một digest SHA-256 ổn định, lưu trữ bền nó qua một hợp đồng store có thể cắm thay, và theo dõi hồi quy giữa các lần chạy bằng ContinuousMonitor. Module tiêu thụ các phát hiện do các bề mặt Validation và Compliance tạo ra; bản thân nó không thực hiện kiểm tra phù hợp tiêu chuẩn nào. Để có hướng dẫn quy trình, hãy đọc trang khả năng Evidence trước.

Khả năng này đi kèm trong NextPDF Enterprise (nextpdf/enterprise) và kích hoạt bằng một license envelope bậc Enterprise. Một triển khai không có quyền sử dụng đó sẽ không tải các lớp của khả năng. So sánh các phiên bản và lấy giấy phép.

Bề mặt được cấp phép bởi capability enterprise.compliance.evidence; một quyền sử dụng bị từ chối sẽ từ chối tính năng. Core và Pro tạo ra các phát hiện và báo cáo; việc niêm phong các phát hiện vào một gói bất biến, xác định, có timestamp tùy chọn kèm theo dõi hồi quy không có thành phần tương đương ở bậc Core hay bậc Pro.

Terminal window
composer require nextpdf/enterprise:^3
Ký hiệuTham sốHành vi mặc địnhTrả vềNém ra hoặc thất bại vớiGhi chú
EvidencePortal::__constructEvidenceStoreInterface $store, EvidenceExporter $exporterNối store và exporterEvidencePortalKhông khai báo gìCả hai collaborator đều có thể tiêm
EvidencePortal::generateEvidencestring $documentHash, list<EvidenceRecord> $records, ?string $tsaTimestamp = nullĐếm số đạt/không đạt, niêm phong một gói với id UUID mới và generatedAt theo đồng hồ hệ thống, lưu trữ bền nóEvidencePackageKhông khai báo gìLưu trữ bền qua store(), không phải persistImmutable()
EvidencePortal::getEvidencestring $documentHashGói đã lưu mới nhất cho hash?EvidencePackageKhông khai báo gìnull khi chưa lưu gói nào
EvidencePortal::getHistorystring $documentHashToàn bộ lịch sử, mới nhất trướclist<EvidencePackage>Không khai báo gìThứ tự do store cung cấp
EvidencePortal::exportAsJsonEvidencePackage $packageỦy thác cho exporternon-empty-stringJsonExceptionCùng byte với EvidenceExporter::toJson
EvidencePackage::__constructtám tham số được đặt tên, xem khối mãValue object bất biếnEvidencePackageKhông khai báo gìCác số đếm không được kiểm tra đối chiếu với $records
EvidencePackage::allPassedkhông cófailedCount === 0boolKhông khai báo gìtrue với một gói rỗng; hãy chốt cổng theo totalFindings
EvidencePackage::passRatekhông cópassedCount / totalFindingsfloatKhông khai báo gì0.0 khi totalFindings === 0
EvidenceRecord::__constructstring $policyName, bool $passed, string $details, string $validatorVersion, DateTimeImmutable $timestampKết quả kiểm tra policy đơn lẻ, bất biếnEvidenceRecordKhông khai báo gìMọi thuộc tính đều là public readonly
EvidenceExporter::toJsonEvidencePackage $packageJSON với thứ tự khóa cố định; slash và Unicode không được escapenon-empty-stringJsonExceptionThứ tự khóa mang tính then chốt
EvidenceExporter::exportHashEvidencePackage $packageSHA-256 trên các byte của toJson()non-empty-string (64 hex)JsonExceptionỔn định theo từng gói
EvidenceStoreInterface::storeEvidencePackage $packageGhi thêm; cho phép lịch sử theo từng hash tài liệuvoidDo hiện thực định nghĩaBắt buộc ngữ nghĩa chỉ-ghi-thêm
EvidenceStoreInterface::persistImmutableEvidencePackage $packageGhi WORM ở nơi backend hỗ trợvoidDo hiện thực định nghĩaBackend không phải WORM hành xử như store()
EvidenceStoreInterface::findByDocumentHashstring $documentHashGói gần đây nhất cho hash?EvidencePackageDo hiện thực định nghĩa
EvidenceStoreInterface::findAllByDocumentHashstring $documentHashTất cả gói cho hash, mới nhất trướclist<EvidencePackage>Do hiện thực định nghĩa
EvidenceStoreInterface::countkhông cóTổng số gói đã lưuint<0, max>Do hiện thực định nghĩa
InMemoryEvidenceStorelớpStore nền mảng cho kiểm thử và phát triểnn/an/aKhông bền; không có ngữ nghĩa WORM
ContinuousMonitor::__constructEvidenceStoreInterface $storeNối storeContinuousMonitorKhông khai báo gì
ContinuousMonitor::checkEvidencePackage $currentEvidence, string $documentHashSo sánh khác biệt các tên policy không đạt với gói mới nhất đã lưuMonitorResultKhông khai báo gìLần kiểm tra đầu coi mọi thất bại hiện tại là mới
ContinuousMonitor::isDuestring $documentHash, MonitorSchedule $scheduleĐến hạn khi chưa có chứng cứ trước đó, khoảng thời gian đã trôi qua, hoặc chứng cứ đã lưu mang mốc thời gian tương laiboolKhông khai báo gìAn toàn khi lỗi trước lệch đồng hồ
MonitorResult::__constructtám tham số được đặt tên, xem khối mãKết quả so sánh bất biếnMonitorResultKhông khai báo gìBao gồm cả hai gói và checkedAt
MonitorSchedule::__constructMonitorFrequency $frequency, int $retentionDays = 90, bool $alertOnNewIssues = trueValue object cấu hìnhMonitorScheduleKhông khai báo gìLưu giữ và cảnh báo do host thực thi
MonitorFrequencyenum nền chuỗiCác case Daily, Weekly, Monthlyn/an/aGiá trị nền daily, weekly, monthly
MonitorFrequency::intervalSecondskhông cóKhoảng thời gian theo từng case: 86400, 604800, 2592000positive-intKhông khai báo gìMonthly cố định 30 ngày
final class EvidencePortal
{
public function __construct(
private readonly EvidenceStoreInterface $store,
private readonly EvidenceExporter $exporter,
)
public function generateEvidence(string $documentHash, array $records, ?string $tsaTimestamp = null): EvidencePackage
public function getEvidence(string $documentHash): ?EvidencePackage
public function getHistory(string $documentHash): array
public function exportAsJson(EvidencePackage $package): string
}
final readonly class EvidencePackage
{
public function __construct(
public string $packageId,
public string $documentHash,
public array $records,
public int $totalFindings,
public int $passedCount,
public int $failedCount,
public DateTimeImmutable $generatedAt,
public ?string $tsaTimestamp = null,
)
public function allPassed(): bool
public function passRate(): float
}
final readonly class EvidenceRecord
{
public function __construct(
public string $policyName,
public bool $passed,
public string $details,
public string $validatorVersion,
public DateTimeImmutable $timestamp,
)
}
final readonly class EvidenceExporter
{
public function toJson(EvidencePackage $package): string
public function exportHash(EvidencePackage $package): string
}
interface EvidenceStoreInterface
{
public function store(EvidencePackage $package): void;
public function persistImmutable(EvidencePackage $package): void;
public function findByDocumentHash(string $documentHash): ?EvidencePackage;
public function findAllByDocumentHash(string $documentHash): array;
public function count(): int;
}
final class ContinuousMonitor
{
public function __construct(
private readonly EvidenceStoreInterface $store,
)
public function check(EvidencePackage $currentEvidence, string $documentHash): MonitorResult
public function isDue(string $documentHash, MonitorSchedule $schedule): bool
}
final readonly class MonitorSchedule
{
public function __construct(
public MonitorFrequency $frequency,
public int $retentionDays = 90,
public bool $alertOnNewIssues = true,
)
}
enum MonitorFrequency: string
{
case Daily = 'daily';
case Weekly = 'weekly';
case Monthly = 'monthly';
public function intervalSeconds(): int
}

EvidencePortal::generateEvidence(string $documentHash, list<EvidenceRecord> $records, ?string $tsaTimestamp = null): EvidencePackage là điểm vào niêm phong. Các quy tắc quan sát được từ bên ngoài:

  1. Lắp ráp. generateEvidence đếm các bản ghi đạt và không đạt rồi đặt totalFindings bằng tổng của chúng. Nó gán một packageId UUID phiên bản 4 mới, đóng dấu generatedAt bằng đồng hồ hệ thống, lưu trữ bền gói qua EvidenceStoreInterface::store, và trả về nó. Danh sách bản ghi được nhúng theo thứ tự đã cho, không bị sửa đổi.
  2. Tính bất biến. EvidencePackagefinal readonly và không bao giờ bị biến đổi sau khi khởi tạo; nó phù hợp cho lưu trữ WORM. allPassed()failedCount === 0. passRate()passedCount / totalFindings, và bằng 0.0 khi totalFindings === 0.
  3. Xuất xác định. EvidenceExporter::toJson phát ra phần envelope và từng bản ghi với thứ tự khóa cố định, viết tay; trình tự bản ghi theo sát gói. Việc mã hóa là nghiêm ngặt và ném ra khi thất bại, với slash và Unicode được để nguyên không escape (JSON_UNESCAPED_SLASHES). Timestamp được tuần tự hóa bằng DateTimeInterface::RFC3339_EXTENDED, dạng mở rộng của RFC 3339 với phần giây thập phân. exportHash trả về digest SHA-256 dạng hex dài 64 ký tự trên đúng các byte đó. Cùng một gói luôn cho ra cùng một digest, trên bất kỳ host nào, vào bất kỳ lúc nào. Việc tạo lại chứng cứ cho cùng một tài liệu cho ra một packageIdgeneratedAt mới, do đó một digest mới: tính xác định là theo từng gói, không phải theo từng tài liệu.
  4. Timestamp là chứng cứ về thời gian, không phải một phán quyết. Một gói có thể mang theo một token RFC 3161 tùy chọn do bên gọi cung cấp (mã hóa base64). Token ràng buộc dữ liệu của gói với một giá trị thời gian. Module nhúng nó như một chuỗi mờ; nó không lấy, không phân tích, và không xác minh token, và nó không bảo chứng cho TSA. Việc xác minh token thuộc về các module Signature và Security.
  5. Theo dõi hồi quy. ContinuousMonitor::check tải gói mới nhất đã lưu cho hash tài liệu và so sánh khác biệt các tên policy không đạt duy nhất. Các vấn đề được phân loại thành newIssues (không đạt bây giờ, trước đó thì không), resolvedIssues (không đạt trước đó, bây giờ thì không), và unchangedIssues (không đạt ở cả hai). hasChanges chỉ là true khi tồn tại vấn đề mới hoặc đã giải quyết; riêng các thất bại không đổi báo false. Ở lần kiểm tra đầu tiên, mọi thất bại hiện tại đều là mới.
  6. Lập lịch. ContinuousMonitor::isDue trả về true khi không có chứng cứ nào cho hash, khi thời gian trôi qua kể từ generatedAt đã lưu đạt tới khoảng tần suất của lịch, hoặc khi chứng cứ đã lưu mang mốc thời gian tương lai so với host thăm dò. Trường hợp mốc thời gian tương lai là an-toàn-khi-lỗi: tệ nhất là một lần kiểm tra lại thừa, không bao giờ bỏ lỡ một lần.
  7. Hợp đồng store. Các hiện thực EvidenceStoreInterface phải hỗ trợ ngữ nghĩa chỉ-ghi-thêm; nhiều gói cho mỗi hash tài liệu tạo thành lịch sử, mới nhất trước. persistImmutable nhắm tới các backend có khả năng WORM; các hiện thực không phải WORM phải hành xử đúng như store.
  • Một gói rỗng báo allPassed() truepassRate() 0.0. Hãy chốt cổng theo totalFindings > 0 trước khi coi một gói là đạt.
  • Việc khởi tạo EvidencePackage trực tiếp không kiểm tra các số đếm đối chiếu với $records. Hãy dùng portal, hoặc tự giữ các số đếm nhất quán.
  • generateEvidence lưu trữ bền trước khi trả về. Hãy chạy ContinuousMonitor::check với gói mới trước khi lưu trữ bền nó; một lần kiểm tra sau khi lưu trữ sẽ so sánh gói với chính nó và báo không có thay đổi.
  • exportHash bao trùm đúng các byte của toJson. Một digest được tính lại bởi bất kỳ bộ tuần tự hóa, thứ tự khóa, hoặc chính sách escape nào khác sẽ không khớp.
  • MonitorFrequency::Monthly là một cửa sổ cố định 30 ngày, không phải một tháng theo lịch.
  • MonitorSchedule::$retentionDays$alertOnNewIssues là cấu hình được mang theo cho các bộ lập lịch của host. Module không bao giờ xóa chứng cứ và không bao giờ gửi cảnh báo.
  • InMemoryEvidenceStore dành cho kiểm thử và phát triển. Các gói bị mất khi tiến trình thoát, và persistImmutable của nó không có ngữ nghĩa WORM.
  • Các chuỗi details của bản ghi được xuất nguyên văn; exporter không biên tập che giấu. Hãy để bí mật và dữ liệu cá nhân chịu quản lý ra ngoài details. Nơi lưu trú, lưu giữ, và kiểm soát truy cập tuân theo hiện thực store của người vận hành.
  • Tham số tsaTimestamp được chấp nhận như một chuỗi mờ. Một token sai định dạng được nhúng nguyên vẹn và chỉ lộ ra ở khâu xác minh phía sau.

Module này tính các digest SHA-256 và nhúng một token RFC 3161 do bên gọi cung cấp. Nó không thực hiện ký và không lưu giữ khóa. Hành vi ở chế độ FIPS do các module SecuritySignature quản lý.

Tuyên bốTiêu chuẩnĐiều khoản
Một token timestamp cho biết rằng một dữ liệu đã tồn tại tại một thời điểm cụ thể.IETF RFC 3161§2
Các timestamp được xuất dùng hồ sơ ngày/giờ Internet của ISO 8601, với phần giây thập phân.IETF RFC 3339§5.6
Vật liệu xác thực được nhúng bên trong một PDF thuộc về Document Security Store; bề mặt đó là của module Signature, không phải module này.ISO 32000-2:2020§12.8.4

Mọi điều khoản đều được diễn giải lại; NextPDF không tái hiện văn bản quy phạm. NextPDF không đưa ra tuyên bố chứng nhận nào. Việc thu thập chứng cứ hỗ trợ các quy trình kiểm toán; nó không phải là một chứng thực pháp lý và không phải một chứng nhận kiểm toán. Một token timestamp chỉ là chứng cứ về thời gian, và module này không khẳng định rằng bất kỳ nội dung nào là tuân thủ. Hiệu lực và sự phù hợp vẫn là thuộc tính của tệp cuối cùng cộng với một validator. Tài liệu tham chiếu này không phải là một ý kiến pháp lý; hãy tham khảo các cố vấn tuân thủ và pháp lý của riêng bạn.

  • Mã nguồn module mang @since 2.2.0; tài liệu tham chiếu này ghi lại bề mặt như được phát hành trong nextpdf/enterprise 3.1.0.
  • Mọi thứ chạy trong tiến trình trên host của bạn. Module không thực hiện I/O mạng nào và không bao giờ tự liên hệ một TSA.
  • Thứ tự khóa trong array-literal của exporter mang tính then chốt theo thiết kế. Việc sắp xếp lại nó sẽ làm thay đổi exportHash và vô hiệu hóa các digest đã lưu trước đó; mã nguồn cấm điều đó.
  • packageId là một UUID phiên bản 4 được lắp ráp từ đầu ra của \random_bytes(16); các định danh là duy nhất nhưng không tái lập được.
  • Lưu trữ bền do host cung cấp. Việc thực thi WORM và kiểm soát truy cập là trách nhiệm của người vận hành; store trong bộ nhớ là hiện thực duy nhất đi kèm.
  • MonitorResult là một value object final readonly; tám thuộc tính của nó là public, bao gồm checkedAt, thời gian đồng hồ hệ thống của lần kiểm tra.

Trang này chỉ ghi lại hành vi quan sát được từ bên ngoài và bề mặt public API được hỗ trợ. Các đường dẫn namespace nội bộ, lớp trợ giúp, bảng cơ chế, tên tệp runbook, và tiền tố ticket nằm ngoài phạm vi.