Le mot de passe qui l’ouvre, et ce qu’on peut en faire

Protéger le document par un mot de passe, et nommer ce que le logiciel de lecture est prié d’autoriser : l’impression, la copie, le remplissage d’un formulaire.

Le résultat dans un vrai PDF

Un document qui se lit librement et demande à ne pas être copié

Une page qui s’ouvre sans mot de passe et s’imprime comme n’importe quelle autre, mais qui demande au logiciel de lecture d’interdire le copier-coller de son texte. Le texte est chiffré dans le fichier : un programme qui le lit octet par octet n’y trouve aucune phrase.

Ouvrir le PDF Voir l’exemple complet

Également dans les exemples : Un document qui demande un mot de passe pour s’ouvrir

Résumé

Un classeur va dans un tiroir et le tiroir prend une clé. Un PDF fonctionne de la même façon, avec deux mots de passe plutôt qu’un. Le premier est tapé par qui ouvre le document : tant qu’il n’est pas tapé, le logiciel de lecture ne montre rien du tout. Le second appartient à qui a écrit le document, et lui donne tout ce dont les autres sont priés de se passer. Les deux sont à votre choix, et vous pouvez demander l’un, l’autre, les deux, ou aucun. Ce que vous nommez est autorisé, et ce que vous laissez de côté le reste. Ce sont des souhaits, que respectent les logiciels de lecture réellement utilisés ; seul le mot de passe avant la première page ferme vraiment la porte. Et comme le mot de passe voyage avec votre requête, envoyez-la sur une connexion sécurisée — le document est écrit avec lui, et il est oublié dès que le fichier repart.

Techniquement

Écrit au premier niveau d’une requête, sous "protection"

protection verrouille le document : chaque chaîne et chaque flux est chiffré en AES avec une clé de chiffrement de deux cent cinquante-six bits. Le bloc suffit à lui seul — un bloc qui ne nomme aucun mot de passe verrouille tout de même le fichier et le laisse s’ouvrir sans aucune saisie, comme la plupart des fichiers protégés. C’est à la requête de fournir la clé de chiffrement : si elle est donnée dans protection.key, la même requête écrite deux fois donne le même fichier. Si elle est omise, elle est tirée du hasard propre à la machine une fois par rendu et ne dérive de rien de ce que contient la requête, si bien que deux rendus d’une même requête protégée donnent deux fichiers différents. C’est l’un des deux endroits du schéma où cela vaut : l’autre est un passage de texte qui demande l’heure du rendu, et qui lit l’horloge pendant la création de la page. Les autorisations sont nommées une à une, chaque nom accordant une chose, et un nom autre que ces huit revient en 400 avec la liste des huit. Ce que les autorisations retiennent est inscrit dans le fichier pour que le logiciel de lecture le respecte, et les logiciels de lecture d’usage courant le respectent bien ; seul le user_password empêche, à lui seul, d’afficher une page. Un mot de passe reste à l’intérieur du rendu : il n’atteint ni le journal, ni un rapport d’incident, ni la réponse donnée au client, et le corps de la requête est jeté dès qu’il est lu.

Schéma de la requête

  • protection — objet, facultatif, absent par défaut. Présent, le document est verrouillé en AES-256 ; absent, il est écrit en clair.
  • protection.user_password — chaîne, facultative. Ce qu’une personne tape avant que le logiciel de lecture ne montre la moindre page. En son absence, le document s’ouvre sans aucune saisie.
  • protection.owner_password — chaîne, facultative. Ce que l’auteur tape pour obtenir tout ce que les autorisations retiennent. Absente, le fichier inscrit l’autre mot de passe à sa place.
  • protection.permissions — tableau de chaînes, facultatif, vide par défaut. Chaque nom accorde une chose, et ce qui est accordé est ce qui est nommé. Huit valeurs :
    • printing — le document peut être imprimé.
    • printing_at_full_resolution — le document s’imprime à la résolution à laquelle il a été créé. Avec printing seul, il s’imprime comme une image grossière.
    • modifying — le contenu du document peut être modifié. L’annoter, remplir un formulaire et réorganiser ses pages ont chacun leur autorisation, ci-dessous.
    • copying — on peut en extraire le texte et les images.
    • annotating — on peut dessiner par-dessus et remplir les cases d’un formulaire.
    • filling_forms — on peut remplir les cases d’un formulaire même quand annotating est absent de la liste.
    • extracting_for_accessibility — le texte peut être extrait pour un lecteur d’écran ; tout document verrouillé l’accorde, que la requête le nomme ou non.
    • assembling — on peut insérer, tourner ou retirer des pages.
  • Un nom hors des huit est renvoyé en 400, avec la liste des huit.
  • protection.key — chaîne, facultative. Les trente-deux octets sur lesquels la clé de chiffrement est bâtie, en base64, comme voyagent les octets d’une police incorporée. Absente, le serveur les tire une fois par rendu. Une valeur qui n’est pas du base64, ou qui ne fait pas trente-deux octets une fois décodée, revient en 400.
  • protection.only_the_attachments — booléen, facultatif, false par défaut. true restreint le verrouillage aux pièces jointes du document : les pages, les chaînes et ce que le document dit de lui-même sont écrits en clair et s’ouvrent sans aucune saisie, chaque pièce jointe est écrite chiffrée, et le mot de passe que donne la requête est ce qui donne accès aux pièces jointes. Une requête qui le demande pour un document sans pièce jointe, ou qui donne les deux mots de passe, revient en 400.
  • protection.for_older_readers — booléen, facultatif, false par défaut. true verrouille le document d’une façon que les anciens logiciels de lecture savent ouvrir : AES avec une clé de 128 bits, les mots de passe écrits dans le jeu de caractères PDFDocEncoding, le document déclarant au moins PDF 1.6. Un mot de passe que ce jeu de caractères ne sait pas écrire revient en 400.
  • protection.metadata_in_the_clear — booléen, facultatif, false par défaut. true laisse lisible le paquet de métadonnées du document alors que tout le reste est fermé : le titre, l’auteur et le reste de ce que le document dit de lui-même en XML, pour qu’un index de recherche ou le catalogue d’une archive le lise sans le mot de passe. Les chaînes du dictionnaire d’informations restent fermées avec le reste.
  • protection.authenticated — booléen, facultatif, false par défaut. Le verrou qui signale au logiciel de lecture qu’un octet a été modifié : AES en mode Galois/Counter, PDF 2.0.

Deux rendus d’une même requête protégée qui n’énonce aucune clé sont deux fichiers différents, la clé de chiffrement étant tirée de la machine à chaque fois. Un document qui doit revenir octet pour octet d’un rendu à l’autre énonce sa propre protection.key, ou s’écrit en clair, et ne demande aucun passage de texte qui contienne le moment du rendu — ce sont là les deux endroits du schéma où une requête donne deux fichiers.

Archivage : archive et protection ne se demandent pas ensemble, et une requête qui déclare les deux reçoit une réponse 400. Une norme d’archivage promet que le fichier restera lisible le jour où plus personne ne connaîtra le mot de passe, et chaque partie de PDF/A impose cette promesse au fichier.

Accessibilité : tout document verrouillé accorde extracting_for_accessibility, que la requête le nomme ou non, pour qu’un lecteur d’écran ait toujours quelque chose à lire.

Un mot de passe voyage tel quel dans la requête : on l’envoie donc en TLS, et on le tient à l’écart de tout ce qui garde une trace des requêtes.

Une requête entière qui crée un PDF

{
  "protection": {
    "user_password": "the-reader-types-this",
    "owner_password": "the-author-keeps-this",
    "permissions": [
      "printing",
      "printing_at_full_resolution",
      "extracting_for_accessibility"
    ]
  },
  "metadata": { "title": "Salary statement, March 2026" },
  "standard_fonts": [{ "name": "sans", "face": "helvetica" }],
  "items": [
    {
      "type": "text",
      "rect": { "llx": 60, "lly": 740, "urx": 535, "ury": 768 },
      "content": ["Salary statement, March 2026"],
      "font": "sans",
      "font_size": 18
    }
  ]
}

La ligne qui l’envoie, en trois langages

Le document dans son ensemble

Les numéros que montre le logiciel de lecture Cent courriers dans un seul fichier Ce que le document dit de lui-même Ce que le document dit de lui-même, dit une seule fois Un texte que personne ne peut copier Les notes qu’un programme laisse pour lui-même Les notes qu’un programme laisse sur une page Les données qu’un programme accroche à un passage d’encre Un fichier encore lisible dans des dizaines d’années La norme d’impression que le document déclare La norme d’impression variable déclarée par le document Une facture qu’un humain et une machine lisent L’adresse à partir de laquelle se lisent les liens relatifs La version de PDF que le fichier déclare Les extensions de PDF dont le fichier dit se servir Ce qu’une image dit d’elle-même, et comment elle est lue Les pièces jointes du document, à côté de ses pages Des fichiers que le document nomme sans les contenir Les pièces jointes, présentées en portefeuille Les pièces jointes que revendique une page Les pièces jointes que revendique une police La fiche d’identité propre à une police Les pièces jointes que revendique la fiche du document Une fiche de document rédigée ailleurs Les zones d’une page où un lecteur mesure La fiche d’identité que contient une seule page La norme d’accessibilité que le document déclare Les normes contre lesquelles le document fini est mesuré

Où aller ensuite

Toutes les clés JSON d’une requête, en une page Les quarante et un autres réglages d’une requête

Voir les prix Voir les exemples