{"title":"Kryptografisk signering","version":"6.0","locale":"sv","docname":"topics/signing","url":"/sv/6.0/topics/signing/","canonical":"https://djangodocs.dev/sv/6.0/topics/signing/","summary":"Den gyllene regeln för säkerhet i webbapplikationer är att aldrig lita på data från källor som inte är betrodda. Ibland kan det vara användbart att skicka data…","html":"<span id=\"cryptographic-signing\"></span><h1>Kryptografisk signering<a class=\"heading-anchor\" href=\"#module-django.core.signing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Den gyllene regeln för säkerhet i webbapplikationer är att aldrig lita på data från källor som inte är betrodda. Ibland kan det vara användbart att skicka data genom ett icke betrott medium. Kryptografiskt signerade värden kan skickas genom en icke betrodd kanal i trygg förvissning om att eventuell manipulering kommer att upptäckas.</p>\n<p>Django tillhandahåller både ett API på låg nivå för att signera värden och ett API på hög nivå för att ställa in och läsa signerade cookies, en av de vanligaste användningarna av signering i webbapplikationer.</p>\n<p>Du kanske också tycker att det är bra att skriva under för följande:</p>\n<ul class=\"simple\">\n<li><p>Generering av URL:er för ”återställ mitt konto” som skickas till användare som har förlorat sitt lösenord.</p></li>\n<li><p>Säkerställa att data som lagras i dolda formulärfält inte har manipulerats.</p></li>\n<li><p>Generera hemliga URL:er för engångsbruk för att ge tillfällig tillgång till en skyddad resurs, t.ex. en nedladdningsbar fil som en användare har betalat för.</p></li>\n</ul>\n<section id=\"protecting-secret-key-and-secret-key-fallbacks\">\n<h2>Skydda <code class=\"docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code><a class=\"heading-anchor\" href=\"#protecting-secret-key-and-secret-key-fallbacks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>När du skapar ett nytt Django-projekt med <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a>, genereras filen <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> automatiskt och får ett slumpmässigt <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>-värde. Detta värde är nyckeln till att säkra signerade data - det är viktigt att du håller det säkert, annars kan angripare använda det för att generera sina egna signerade värden.</p>\n<p><a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a> kan användas för att rotera hemliga nycklar. Värdena kommer inte att användas för att signera data, men om de anges kommer de att användas för att validera signerade data och måste hållas säkra.</p>\n</section>\n<section id=\"using-the-low-level-api\">\n<h2>Använda API:et på låg nivå<a class=\"heading-anchor\" href=\"#using-the-low-level-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Djangos signeringsmetoder finns i modulen <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.signing</span></code>. För att signera ett värde, instansiera först en <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code> instans:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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=\"s2\">&quot;My string&quot;</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:v9G-nxfz3iQGTXrePqYPlGvH79WTcIgj1QIQSUODTW0&#39;</span>\n</code></pre></div>\n<p>Signaturen läggs till i slutet av strängen, efter kolon. Du kan hämta originalvärdet med hjälp av metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">unsign</span></code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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>Om du skickar ett värde som inte är en sträng till <code class=\"docutils literal notranslate\"><span class=\"pre\">sign</span></code>, kommer värdet att tvingas till sträng innan det signeras, och <code class=\"docutils literal notranslate\"><span class=\"pre\">unsign</span></code>-resultatet kommer att ge dig strängvärdet:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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>Om du vill skydda en lista, tupel eller dictionary kan du göra det med hjälp av metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">sign_object()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">unsign_object()</span></code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signed_obj</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign_object</span><span class=\"p\">({</span><span class=\"s2\">&quot;message&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Hello!&quot;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signed_obj</span>\n<span class=\"go\">&#39;eyJtZXNzYWdlIjoiSGVsbG8hIn0:bzb48DBkB-bwLaCnUVB75r5VAPUEpzWJPrTb80JMIXM&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign_object</span><span class=\"p\">(</span><span class=\"n\">signed_obj</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span>\n<span class=\"go\">{&#39;message&#39;: &#39;Hello!&#39;}</span>\n</code></pre></div>\n<p>Se <a class=\"reference internal\" href=\"#signing-complex-data\"><span class=\"std std-ref\">Skydd av komplexa datastrukturer</span></a> för mer information.</p>\n<p>Om signaturen eller värdet har ändrats på något sätt, kommer ett <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.signing.BadSignature</span></code> undantag att uppstå:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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=\"s2\">&quot;m&quot;</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<span class=\"gp\">...</span>\n</code></pre></div>\n<p>Som standard använder klassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code> inställningen <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> för att generera signaturer. Du kan använda en annan hemlighet genom att skicka den till konstruktören för <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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=\"n\">key</span><span class=\"o\">=</span><span class=\"s2\">&quot;my-other-secret&quot;</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=\"s2\">&quot;My string&quot;</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:o3DrrsT6JRB73t-HDymfDNbTSxfMlom2d8TiUlb1hWY&#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=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></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\">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>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fallback_keys</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns a signer which uses <code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> to generate signatures and <code class=\"docutils literal notranslate\"><span class=\"pre\">sep</span></code> to\nseparate values. <code class=\"docutils literal notranslate\"><span class=\"pre\">sep</span></code> cannot be in the <span class=\"target\" id=\"index-0\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc4648.html#section-5\"><strong>URL safe base64 alphabet</strong></a>. This alphabet contains alphanumeric characters, hyphens,\nand underscores. <code class=\"docutils literal notranslate\"><span class=\"pre\">algorithm</span></code> must be an algorithm supported by\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/hashlib.html#module-hashlib\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">hashlib</span></code></a>, it defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'sha256'</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">fallback_keys</span></code> is a list\nof additional values used to validate signed data, defaults to\n<a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a>.</p>\n</dd></dl>\n\n<section id=\"using-the-salt-argument\">\n<h3>Använda argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">salt</span></code><a class=\"heading-anchor\" href=\"#using-the-salt-argument\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du inte vill att alla förekomster av en viss sträng ska ha samma signaturhash kan du använda det valfria argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">salt</span></code> till klassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer</span></code>. Om du använder ett salt kommer den signerande hashfunktionen att seedas med både saltet och din <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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=\"s2\">&quot;My string&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;My string:v9G-nxfz3iQGTXrePqYPlGvH79WTcIgj1QIQSUODTW0&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign_object</span><span class=\"p\">({</span><span class=\"s2\">&quot;message&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Hello!&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;eyJtZXNzYWdlIjoiSGVsbG8hIn0:bzb48DBkB-bwLaCnUVB75r5VAPUEpzWJPrTb80JMIXM&#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=\"s2\">&quot;extra&quot;</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=\"s2\">&quot;My string&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;My string:YMD-FR6rof3heDkFRffdmG4pXbAZSOtb-aQxg3vmmfc&#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=\"s2\">&quot;My string:YMD-FR6rof3heDkFRffdmG4pXbAZSOtb-aQxg3vmmfc&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;My string&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">sign_object</span><span class=\"p\">({</span><span class=\"s2\">&quot;message&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Hello!&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;eyJtZXNzYWdlIjoiSGVsbG8hIn0:-UWSLCE-oUAHzhkHviYz3SOZYBjFKllEOyVZNuUtM-I&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign_object</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;eyJtZXNzYWdlIjoiSGVsbG8hIn0:-UWSLCE-oUAHzhkHviYz3SOZYBjFKllEOyVZNuUtM-I&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;message&#39;: &#39;Hello!&#39;}</span>\n</code></pre></div>\n<p>Using salt in this way puts the different signatures into different\nnamespaces. A signature that comes from one namespace (a particular salt\nvalue) cannot be used to validate the same plaintext string in a different\nnamespace that is using a different salt setting. The result is to prevent an\nattacker from using a signed string generated in one place in the code as input\nto another piece of code that is generating (and verifying) signatures using a\ndifferent salt.</p>\n<p>Till skillnad från din <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> behöver ditt saltargument inte vara hemligt.</p>\n</section>\n<section id=\"verifying-timestamped-values\">\n<h3>Verifiering av tidsstämplade värden<a class=\"heading-anchor\" href=\"#verifying-timestamped-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">TimestampSigner</span></code> är en subklass av <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> som lägger till en signerad tidsstämpel till värdet. Detta gör att du kan bekräfta att ett signerat värde skapades inom en viss tidsperiod:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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=\"s2\">&quot;hello&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">value</span>\n<span class=\"go\">&#39;hello:1stLqR:_rvr4oXCgT4HyfwjXaU39QvTnuNuUthFRCzNOy4Hqt0&#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=\"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=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></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\">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\">Link to this definition</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Skriv <code class=\"docutils literal notranslate\"><span class=\"pre\">värde</span></code> och lägg till aktuell tidsstämpel till det.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Checks if <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> was signed less than <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> seconds ago,\notherwise raises <code class=\"docutils literal notranslate\"><span class=\"pre\">SignatureExpired</span></code>. The <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> parameter can\naccept an integer or a <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.timedelta</span></code></a> object.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.TimestampSigner.sign_object\">\n<span class=\"sig-name descname\"><span class=\"pre\">sign_object</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\">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.TimestampSigner.sign_object\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Koda, eventuellt komprimera, lägga till aktuell tidsstämpel och signera komplex datastruktur (t.ex. lista, tupel eller ordbok).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.signing.TimestampSigner.unsign_object\">\n<span class=\"sig-name descname\"><span class=\"pre\">unsign_object</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">signed_obj</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.TimestampSigner.unsign_object\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Checks if <code class=\"docutils literal notranslate\"><span class=\"pre\">signed_obj</span></code> was signed less than <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> seconds ago,\notherwise raises <code class=\"docutils literal notranslate\"><span class=\"pre\">SignatureExpired</span></code>. The <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> parameter can\naccept an integer or a <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.timedelta</span></code></a> object.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"protecting-complex-data-structures\">\n<span id=\"signing-complex-data\"></span><h3>Skydd av komplexa datastrukturer<a class=\"heading-anchor\" href=\"#protecting-complex-data-structures\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du vill skydda en lista, tupel eller dictionary kan du göra det med hjälp av metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">Signer.sign_object()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">unsign_object()</span></code>, eller signeringsmodulens <code class=\"docutils literal notranslate\"><span class=\"pre\">dumps()</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">loads()</span></code> funktioner (som är förkortningar för <code class=\"docutils literal notranslate\"><span class=\"pre\">TimestampSigner(salt='django.core.signing').sign_object()/unsign_object()</span></code>). Dessa använder JSON-serialisering under huven. JSON säkerställer att även om din <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a> blir stulen kommer en angripare inte att kunna utföra godtyckliga kommandon genom att utnyttja pickle-formatet:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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\">signer</span> <span class=\"o\">=</span> <span class=\"n\">signing</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_object</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:1stLrZ:_QiOBHafwucBF9FyAr54qEs84ZO1UdsO1XiTJCvvdno&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">signer</span><span class=\"o\">.</span><span class=\"n\">unsign_object</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<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:1stLsC:JItq2ZVjmAK6ivrWI-v1Gk1QVf2hOF52oaEqhZHca7I&#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>På grund av JSON:s natur (det finns ingen inbyggd skillnad mellan listor och tupler) kommer du att få en lista från <code class=\"docutils literal notranslate\"><span class=\"pre\">signing.loads(object)</span></code> om du skickar in en tupel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returnerar URL-säker, signerad base64-komprimerad JSON-sträng. Det serialiserade objektet signeras med hjälp av <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>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fallback_keys</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Motsatsen till <code class=\"docutils literal notranslate\"><span class=\"pre\">dumps()</span></code>, ger <code class=\"docutils literal notranslate\"><span class=\"pre\">BadSignature</span></code> om signaturen misslyckas. Kontrollerar <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> (i sekunder) om den är angiven.</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"module-django.core.signing","toc":[{"title":"Skydda SECRET_KEY och SECRET_KEY_FALLBACKS","anchor":"protecting-secret-key-and-secret-key-fallbacks","children":[]},{"title":"Använda API:et på låg nivå","anchor":"using-the-low-level-api","children":[{"title":"Använda argumentet salt","anchor":"using-the-salt-argument","children":[]},{"title":"Verifiering av tidsstämplade värden","anchor":"verifying-timestamped-values","children":[]},{"title":"Skydd av komplexa datastrukturer","anchor":"protecting-complex-data-structures","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"}],"prev":{"docname":"topics/composite-primary-key","title":"Sammansatta primärnycklar","url":"/sv/6.0/topics/composite-primary-key/"},"next":{"docname":"topics/email","title":"Skicka e-post","url":"/sv/6.0/topics/email/"},"formats":{"html":"/sv/6.0/topics/signing/","markdown":"/sv/6.0/topics/signing.md","json":"/sv/6.0/topics/signing.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/signing.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/signing/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}