{"title":"Signatures cryptographiques","version":"3.1","locale":"fr","docname":"topics/signing","url":"/fr/3.1/topics/signing/","canonical":"https://djangodocs.dev/fr/3.1/topics/signing/","summary":"La règle d’or de la sécurité des applications Web est de ne jamais se fier à des données de provenance douteuse. Il peut parfois être pratique de transférer des…","html":"<span id=\"cryptographic-signing\"></span><h1>Signatures cryptographiques<a class=\"heading-anchor\" href=\"#module-django.core.signing\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>La règle d’or de la sécurité des applications Web est de ne jamais se fier à des données de provenance douteuse. Il peut parfois être pratique de transférer des données par un canal non sécurisé. Les valeurs signées cryptographiquement peuvent être transmises de manière fiable au travers d’un canal non sécurisé en sachant que toute modification de donnée sera détectée.</p>\n<p>Django offre à la fois une API de bas niveau pour la signature de valeurs et une API de haut niveau pour la génération et la lecture de cookies signés, l’un des usages les plus courants de la signature dans les applications Web.</p>\n<p>La signature peut également être utile dans les situations suivantes :</p>\n<ul class=\"simple\">\n<li><p>Génération d’URL de « récupération de compte » pour l’envoi à des utilisateurs qui ont perdu leur mot de passe.</p></li>\n<li><p>Garantie de non-altération des données stockées dans des champs de formulaire cachés.</p></li>\n<li><p>Génération d’URL à usage unique pour autoriser un accès temporaire à une ressource protégée, par exemple pour un fichier téléchargeable payé par un utilisateur.</p></li>\n</ul>\n<section id=\"protecting-the-secret-key\">\n<h2>Protection de <code class=\"docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code><a class=\"heading-anchor\" href=\"#protecting-the-secret-key\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque vous créez un nouveau projet Django avec <a class=\"reference internal\" href=\"/fr/3.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a>, le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> est généré automatiquement et contient une valeur aléatoire pour le réglage <a class=\"reference internal\" href=\"/fr/3.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>. Cette valeur est la clé de la sécurisation des données signées, il est donc essentiel de garder cette information secrète, faute de quoi des attaquants pourraient l’utiliser pour générer leurs propres valeurs signées.</p>\n</section>\n<section id=\"using-the-low-level-api\">\n<h2>Utilisation de l’API de bas niveau<a class=\"heading-anchor\" href=\"#using-the-low-level-api\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les méthodes de signature de Django se trouvent dans le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.signing</span></code>. Pour signer une valeur, commencez par créer une instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.signing</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Signer</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span> <span class=\"o\">=</span> <span class=\"n\">Signer</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"s1\">&#39;My string&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span>\n<span class=\"go\">&#39;My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w&#39;</span>\n</code></pre></div>\n<p>La signature est collée à la suite de la chaîne de caractères, en utilisant les deux-points comme séparateur. Vous pouvez récupérer la valeur originale au moyen de la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">unsign</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">original</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">original</span>\n<span class=\"go\">&#39;My string&#39;</span>\n</code></pre></div>\n<p>Si vous passez une valeur non textuelle à <code class=\"docutils literal notranslate\"><span class=\"pre\">sign</span></code>, la valeur sera d’abord forcée à une chaîne avant d’être signée et le résultat de <code class=\"docutils literal notranslate\"><span class=\"pre\">unsign</span></code> donnera cette valeur textuelle</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signed</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"mf\">2.5</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">original</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">signed</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">original</span>\n<span class=\"go\">&#39;2.5&#39;</span>\n</code></pre></div>\n<p>Si la signature ou la valeur a été modifiée d’une manière ou d’une autre, une exception <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.signing.BadSignature</span></code> sera levée :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">signing</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span> <span class=\"o\">+=</span> <span class=\"s1\">&#39;m&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">try</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>   <span class=\"n\">original</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"k\">except</span> <span class=\"n\">signing</span><span class=\"o\">.</span><span class=\"n\">BadSignature</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>   <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Tampering detected!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Par défaut, la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code> utilise le réglage <a class=\"reference internal\" href=\"/fr/3.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> pour générer des signatures. Il est possible d’utiliser un clé secrète différente en la transmettant au constructeur de <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span> <span class=\"o\">=</span> <span class=\"n\">Signer</span><span class=\"p\">(</span><span class=\"s1\">&#39;my-other-secret&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"s1\">&#39;My string&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span>\n<span class=\"go\">&#39;My string:EkfQJafvGyiofrdGnuthdxImIJw&#39;</span>\n</code></pre></div>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.Signer\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Signer</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sep</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">':'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">salt</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">algorithm</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.signing.Signer\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie un objet signataire utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> pour générer des signatures et <code class=\"docutils literal notranslate\"><span class=\"pre\">sep</span></code> pour séparer les valeurs. <code class=\"docutils literal notranslate\"><span class=\"pre\">sep</span></code> ne peut pas se trouver dans <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc4648.html#section-5\"><strong>l’alphabet base64 adapté aux URL</strong></a>. Cet alphabet contient les caractères alphanumériques, le tiret et le soulignement. <code class=\"docutils literal notranslate\"><span class=\"pre\">algorithm</span></code> doit être un algorithme pris en charge par <a class=\"reference external\" href=\"https://docs.python.org/3/library/hashlib.html#module-hashlib\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">hashlib</span></code></a>, sa valeur par défaut étant <code class=\"docutils literal notranslate\"><span class=\"pre\">'sha256'</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">algorithm</span></code> a été ajouté.</p>\n</aside>\n</dd></dl>\n\n<section id=\"using-the-salt-argument\">\n<h3>Utilisation du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">salt</span></code><a class=\"heading-anchor\" href=\"#using-the-salt-argument\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous ne voulez pas que plusieurs occurrences d’une chaîne donnée aient toutes la même empreinte de signature, vous pouvez utiliser le paramètre facultatif <code class=\"docutils literal notranslate\"><span class=\"pre\">salt</span></code> de la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code>. L’utilisation d’un sel (salt) combiné à la clé <a class=\"reference internal\" href=\"/fr/3.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> va nourrir et renforcer la fonction de hachage pour la signature.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span> <span class=\"o\">=</span> <span class=\"n\">Signer</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"s1\">&#39;My string&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span> <span class=\"o\">=</span> <span class=\"n\">Signer</span><span class=\"p\">(</span><span class=\"n\">salt</span><span class=\"o\">=</span><span class=\"s1\">&#39;extra&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"s1\">&#39;My string&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"s1\">&#39;My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;My string&#39;</span>\n</code></pre></div>\n<p>Un tel emploi du sel place les différentes signatures dans des espaces de noms différents. Une signature provenant d’un espace de noms (une valeur de sel particulière) ne peut pas être utilisée pour valider la même chaîne de texte dans un autre espace de noms utilisant une valeur de sel différente. Il en résulte qu’un attaquant ne peut pas utiliser une chaîne signée générée dans une partie du code comme point d’entrée pour une autre partie du code qui génère (et vérifie) les signatures en employant un sel différent.</p>\n<p>Au contraire de <a class=\"reference internal\" href=\"/fr/3.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>, le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">salt</span></code> n’a pas besoin de rester secret.</p>\n</section>\n<section id=\"verifying-timestamped-values\">\n<h3>Vérification de valeurs horodatées<a class=\"heading-anchor\" href=\"#verifying-timestamped-values\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">TimestampSigner</span></code> est une sous-classe de <a class=\"reference internal\" href=\"#django.core.signing.Signer\" title=\"django.core.signing.Signer\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Signer</span></code></a> qui ajoute un horodatage signé à la valeur. Cela permet de confirmer qu’une valeur signée a été créée dans un espace de temps défini :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timedelta</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.signing</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TimestampSigner</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span> <span class=\"o\">=</span> <span class=\"n\">TimestampSigner</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span>\n<span class=\"go\">&#39;hello:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">max_age</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">SignatureExpired: Signature age 15.5289158821 &gt; 10 seconds</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">max_age</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">max_age</span><span class=\"o\">=</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">seconds</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">))</span>\n<span class=\"go\">&#39;hello&#39;</span>\n</code></pre></div>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.TimestampSigner\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TimestampSigner</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sep</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">':'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">salt</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">algorithm</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'sha256'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.signing.TimestampSigner\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.TimestampSigner.sign\">\n<span class=\"sig-name descname\"><span class=\"pre\">sign</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.signing.TimestampSigner.sign\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Signe la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> et lui ajoute l’horodatage actuel.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.TimestampSigner.unsign\">\n<span class=\"sig-name descname\"><span class=\"pre\">unsign</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">max_age</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.signing.TimestampSigner.unsign\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Vérifie si la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> a été signée il y a moins de <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> secondes, sinon génère <code class=\"docutils literal notranslate\"><span class=\"pre\">SignatureExpired</span></code>. Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> accepte un nombre entier ou un objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.timedelta</span></code></a>.</p>\n</dd></dl>\n\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">algorithm</span></code> a été ajouté.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"protecting-complex-data-structures\">\n<h3>Protection de structures de données complexes<a class=\"heading-anchor\" href=\"#protecting-complex-data-structures\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous souhaitez protéger une liste, un tuple ou un dictionnaire, c’est réalisable en utilisant les fonctions <code class=\"docutils literal notranslate\"><span class=\"pre\">dumps</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">loads</span></code> du module de signature. Elles imitent le module pickle de Python, mais utilisent la sérialisation JSON en arrière-plan. Le format JSON assure que même quand la clé <a class=\"reference internal\" href=\"/fr/3.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> a été dérobée, un attaquant ne pourra pas provoquer l’exécution de code arbitraire en exploitant le format pickle :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">signing</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">signing</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">({</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span>\n<span class=\"go\">&#39;eyJmb28iOiJiYXIifQ:1NMg1b:zGcDE4-TCkaeGzLeW9UQwZesciI&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signing</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;foo&#39;: &#39;bar&#39;}</span>\n</code></pre></div>\n<p>En raison de la nature de JSON (il n’existe pas de distinction native entre les listes et les tuples), même si vous passez un tuple, vous obtiendrez une liste dans le résultat de <code class=\"docutils literal notranslate\"><span class=\"pre\">signing.loads(object)</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">signing</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">signing</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">((</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span><span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span><span class=\"s1\">&#39;c&#39;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signing</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"go\">[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]</span>\n</code></pre></div>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.dumps\">\n<span class=\"sig-name descname\"><span class=\"pre\">dumps</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">salt</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'django.core.signing'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">serializer</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">JSONSerializer</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">compress</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.signing.dumps\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie une chaîne JSON utilisable dans une URL, signée et compressée en base64. L’objet sérialisé est signé par <a class=\"reference internal\" href=\"#django.core.signing.TimestampSigner\" title=\"django.core.signing.TimestampSigner\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TimestampSigner</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.loads\">\n<span class=\"sig-name descname\"><span class=\"pre\">loads</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">string</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">salt</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'django.core.signing'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">serializer</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">JSONSerializer</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">max_age</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.signing.loads\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Inverse de <code class=\"docutils literal notranslate\"><span class=\"pre\">dumps()</span></code>, génère <code class=\"docutils literal notranslate\"><span class=\"pre\">BadSignature</span></code> si la vérification de la signature échoue. Vérifie <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> (en secondes) si ce paramètre est défini.</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"module-django.core.signing","toc":[{"title":"Protection de SECRET_KEY","anchor":"protecting-the-secret-key","children":[]},{"title":"Utilisation de l’API de bas niveau","anchor":"using-the-low-level-api","children":[{"title":"Utilisation du paramètre salt","anchor":"using-the-salt-argument","children":[]},{"title":"Vérification de valeurs horodatées","anchor":"verifying-timestamped-values","children":[]},{"title":"Protection de structures de données complexes","anchor":"protecting-complex-data-structures","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/3.1/topics/"}],"prev":{"docname":"topics/conditional-view-processing","title":"Traitement conditionnel de vue","url":"/fr/3.1/topics/conditional-view-processing/"},"next":{"docname":"topics/email","title":"Envoi de messages électroniques","url":"/fr/3.1/topics/email/"},"formats":{"html":"/fr/3.1/topics/signing/","markdown":"/fr/3.1/topics/signing.md","json":"/fr/3.1/topics/signing.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/signing.txt","official":"https://docs.djangoproject.com/fr/3.1/topics/signing/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}