PDF 加密實際上如何運作——以及它的極限
Spec: ISO 32000-2, §7.6ISO 32000-2 §7.6
PDF 加密會打亂文件內部的文字與影像,讓只有持有正確密碼的人才能讀取它們。它是貨真價實的密碼學,而且在它唯一的那項工作上做得很好。它同時也被廣泛地誤解,因為同一項功能還夾帶了第二套機制——權限旗標——它看起來像一道鎖,卻不是。
本頁把這兩者分開。它說明 AES-256 究竟保護了什麼、那兩個密碼真正的用途,以及那條誠實的邊界坐落在何處。
為什麼這很重要
標題為「為什麼這很重要」的區段當一份文件很敏感時,人們會伸手去用加密:一份合約、一張薪資單、一封醫療函件。這份期望很合理——把這東西保持私密,並阻止別人列印或複製它。PDF 令人信服地實現了這份願望的前半段,後半段卻只靠榮譽制度。
把這兩者混為一談,正是代價落地之處。一個團隊把一個檔案標記為「禁止複製」,相信平台會強制執行它,然後就出貨了。幾個月後,某人用另一個讀取器在三十秒內複製了那段文字,而那份從未成立的假設,便悄悄變成一次外洩。加密從未被破解。它只是被要求去做一件它做不到的事。
簡短版本
標題為「簡短版本」的區段- 加密保護的是機密性。 有了 AES-256,PDF 的字串與串流內容就是貨真價實的密文。沒有金鑰,它就無法讀取。
- 使用者密碼負責開啟文件。 提供它,你就能看到內容。沒有它,就沒有任何東西可讀。
- 擁有者密碼掌管權限。 它是那把「完整權限」的金鑰。它所守護的權限旗標——列印、複製、修改——記錄在加密文件的內部。
- 權限旗標是讀取器配合制。 它們是對一個行為端正的讀取器所提出的請求,而非強制執行。一個無視它們的讀取器,照樣可以列印、複製或編輯。
- 結構仍然可見。 加密隱藏的是內容,而非文件的骨架——頁數與物件版面配置並不是祕密。
NextPDF 的處理方式
標題為「NextPDF 的處理方式」的區段PDF 加密由 Spec: ISO 32000-2, §7.6ISO 32000-2 §7.6 所定義。這套模型很精確:一個安全處理器從密碼導出一把檔案加密金鑰,文件的字串與串流以那把金鑰加密,而一個加密字典——由檔案 trailer 所參照——記錄了所用的密碼演算法、金鑰有多長,以及作者宣告了哪些權限。
現代且建議採用的密碼演算法是搭配 256 位元金鑰的 AES。當你以這種方式加密一個 PDF 時,那段可讀的酬載——你會擷取出來的文字、影像位元組、字型資料——就被轉換成密文。文件的外層形狀則刻意保持可讀:讀取器必須先找到加密字典並得知金鑰長度,才能向你索取密碼。這就是為什麼加密最好被理解為內容的機密性,而非整份檔案的不透明。
那兩個密碼坐落在不同的層次,而這項區別正是最值得搞清楚的部分。
- A password is suppliedEither the user password (open) or the owner password (full rights).
- The security handler derives the keyISO 32000-2 §7.6.4 turns the password into the file encryption key.
- Content is decryptedAES-256 turns the encrypted strings and streams back into readable bytes.
- Permissions are consultedThe owner key grants all rights; the user key is bound by the declared permission flags — if the reader chooses to honour them.
使用者密碼是那把開啟用的密碼。它回答一個問題:你究竟可不可以看到內容?沒有使用者密碼,就沒有可讀的文件——這個部分受到密碼學的強制保護,因為沒有導出的金鑰,就沒有任何東西可供解密。
擁有者密碼是那把權限密碼。一個檔案可以由任何人開啟(沒有使用者密碼),卻仍宣告一個擁有者密碼,用來把守那些「完整權限」的動作——高解析度列印、複製文字、修改檔案。關鍵在於:擁有者密碼所保護的那些權限位元,受到標準安全處理器的完整性保護:對它們的竄改會被符合規範的讀取器偵測並拒絕,因為處理器把所宣告的權限綁定到加密金鑰上。這些位元並非字面意義上不可讀或不可編輯的位元組——攻擊者可以更改它們——但一份被更動過的副本將無法通過驗證,因此符合規範的讀取器會把它當成損壞檔案。它們是可察覺竄改的。它們只是不會自我強制執行。
實際範例
標題為「實際範例」的區段加密設定很容易表達。重點在於誠實地解讀其結果:這設定的是意圖,而那份意圖中的權限部分只是建議性的。
<?php
declare(strict_types=1);
use NextPDF\Core\Document;use NextPDF\Security\Encryption\EncryptionMode;use NextPDF\Security\Encryption\Permission;
$document = Document::createStandalone();$document->setTitle('Confidential Offer');$document->addPage();
// Confidentiality is real: AES-256 means the content is unreadable// without the user password. This half is cryptographically enforced.$document->encrypt( userPassword: 'open-sesame', ownerPassword: 'full-rights-key', mode: EncryptionMode::Aes256, // Permissions are a declared request to a cooperating reader, // recorded inside the encrypted document — not a hard lock. permissions: Permission::Print->value | Permission::CopyContent->value,);
$document->save('offer.pdf');使用者密碼與擁有者密碼是兩把擔負不同職責的不同金鑰。permissions 引數陳述了一個行為端正的讀取器應該允許什麼。它是誠實的中繼資料,受到安全處理器的完整性保護,使得竄改可被察覺——而那就是一個產製端函式庫所能承諾的上限。
常見的誤解
標題為「常見的誤解」的區段陷阱是把「權限」讀成「強制執行」。這很直覺:旗標說不允許列印,那麼列印當然就被擋住了。但 PDF 裡沒有任何東西能伸出手去停用讀取器的列印按鈕。那個權限整數是記錄下來,供一個配合的讀取器去遵從的。一個選擇不配合的讀取器——而確實有好幾個是如此——可以自由地列印、複製與編輯。
NextPDF 在這一點上是刻意為之的。核心加密路徑把權限旗標當成所宣告的意圖,而從不假裝去強制執行它們。如果你需要某些動作被真正地阻止,那項管控就必須住在檔案之外——在你把文件交給誰,或在環繞它的某套存取控制系統裡。
限制與邊界
標題為「限制與邊界」的區段要精確說明每一半各自保證什麼。加密(使用者密碼那一層)是一項貨真價實的機密性管控:只要密碼夠強就很強,而且其強度僅及於你所選擇的那個祕密。權限(擁有者密碼那一層)是可察覺竄改的中繼資料,而非存取控制。
| 你也許會期望什麼 | 加密實際上提供了什麼 |
|---|---|
| 沒有密碼就沒有人能讀取內容 | 真的。有了 AES-256 與一個夠強的使用者密碼,沒有金鑰就無法讀取那些字串與串流。確實受到強制保護。 |
| 沒有人能把「禁止複製」改寫成「允許複製」 | 可察覺竄改,而非不可能。那些權限旗標受到標準安全處理器的完整性保護:外部人士可以編輯那些位元組,但被更動過的副本將無法通過驗證,因此符合規範的讀取器會偵測並拒絕該變更。 |
| 讀取器會被阻止複製或列印 | 任何 PDF 產製端都不保證這點。一個不配合的讀取器可以無視那些旗標。這是格式的性質,而非 NextPDF 的限制。 |
還有另外兩條邊界值得明白地陳述。第一,加密保護的是內容,而非文件的結構:物件版面配置與頁數仍然可見,而這是正常且必要的,好讓讀取器能定位到加密字典。第二,一個加密的 PDF 無法同時宣稱封存用的 PDF/A 一致性——那個設定檔禁止 Encrypt 項目,因此你只能二擇一。加密與權限疑難排解頁詳細涵蓋了那些具體的例外狀況,以及對 PDF/A 的拒絕。
相關文件
標題為「相關文件」的區段- 標準格局——ISO 32000-2 及其加密條款,在眾多 PDF 標準之間坐落在何處。
- 加密與權限旗標——那些實務性的條目:解密失敗,以及程式碼中的權限邊界。
- PDF 到底是什麼——加密所保護的物件模型,以及它所留下可見的結構。
- 簽章在 PDF 中的存放方式——文件信任的另一半:加密用於隱藏,簽章用於證明。
詞彙表
標題為「詞彙表」的區段- AES-256——搭配 256 位元金鑰的進階加密標準(Advanced Encryption Standard),用於 PDF 內容加密的建議現代密碼演算法。
- 使用者密碼(開啟密碼)——開啟並讀取一份加密文件所需的祕密。沒有它,內容就無法被解密。
- 擁有者密碼(權限密碼)——那把掌管權限旗標的「完整權限」祕密。一份文件可以有它,卻不要求使用者密碼才能開啟。
- 權限旗標——儲存在加密字典中、所宣告的列印/複製/修改意圖。受完整性保護以便竄改可被察覺,但僅由一個配合的讀取器去遵從。
- 安全處理器——從密碼導出檔案加密金鑰的元件,由 ISO 32000-2 中的標準安全處理器所定義。
- 讀取器配合制——一種仰賴消費端軟體選擇遵從的管控,而非由檔案本身強制執行。