Säkerhet · På djupet

Hela den kryptografiska livscykeln

En noggrann genomgång av vad som händer med dina data i varje steg – med primitiver, parametrar och förtroendegränser utskrivna. Varje steg börjar med en enkel sammanfattning, så du kan läsa på den nivå du vill.

Steg 01 · Kryptering

Din hemlighet förseglas på din enhet

Enkelt uttryckt: krypteringen sker i din webbläsare, innan något laddas upp. Det vi tar emot är redan oläsligt.

När du trycker på Kryptera hämtar webbläsaren en ny 256-bitars innehållsnyckel från WebCrypto CSPRNG och krypterar ditt innehåll med AES-256-GCM. GCM är autentiserad: varje block har en 128-bitars tagg, så all senare manipulation upptäcks i stället för att tyst dekrypteras.

Text och filer hanteras på exakt samma sätt – båda blir en enda ogenomskinlig binär klump, utfylld till en standardstorlek så att ett kort lösenord och en liten fil ser likadana ut. Klartexten rör aldrig nätverket och lämnar aldrig flikens minne.

ChifferAES-256-GCM, block om 64 KiB
Innehållsnyckel256 bitar, ny för varje hemlighet
Nonce7 byte slumpmässigt prefix + räknare
Autentiseringstagg128 bitar per block
UtfyllnadPadmé, minst 64 KiB

Steg 02 · Nyckelförvaring

Nyckeln gömmer sig i länken, inte på våra servrar

Enkelt uttryckt: delen av länken efter # innehåller nyckeln – och webbläsare skickar aldrig den delen till någon server.

Din länk bär ett slumpmässigt 256-bitars frö i URL:ens fragment – allt efter #. Enligt URL-specifikationen tar webbläsaren bort fragmentet, och det ingår aldrig i förfrågan som skickas till våra servrar. Från fröet härleder webbläsaren, med HKDF, ett uppslagsvärde för att hitta hemligheten och nyckeln som packar upp innehållsnyckeln. Servern ser bara en hash av uppslagsvärdet.

Mottagarens webbläsare läser fröet från fragmentet och gör samma härledning lokalt. Det är vad ”nollkunskap” betyder här: att ha chiffertexten är meningslöst utan länken.

Nyckelns platsURL-fragment #
Skickas till servern?aldrig
Frö32 slumpmässiga byte, base64url
HärledningHKDF-SHA-256
Servern lagrarendast SHA-256(uppslag)

Steg 03 · Valfri lösenfras

Ett andra lås som bara människor har

Enkelt uttryckt: lägg till en lösenfras, så kan inte ens den som har hela länken öppna hemligheten utan den.

Om du anger en lösenfras sträcks den med Argon2id – en minneskrävande funktion för nyckelhärledning – och kombineras med fröet till nyckeln som packar in innehållsnyckeln. Själva lösenfrasen skickas eller lagras aldrig; bara du och mottagaren känner till den. Felaktiga gissningar provas om i mottagarens webbläsare mot data den redan har, så servern kan inte räkna dem.

Minneskravet gör storskaliga gissningar offline dyra, även med GPU:er och ASIC:ar. Dela lösenfrasen via en annan kanal än länken, så möts de två faktorerna aldrig på samma ställe. Argon2-modulen hämtas vid varje skapande och visning, så nätverket kan inte se vilka hemligheter som använder en lösenfras.

KDFArgon2id
Salt128 bitar, slumpmässigt
InpackningAES-256-GCM, 96-bitars IV

Steg 04 · Överföring & lagring

Bara chiffertext lämnar din enhet

Enkelt uttryckt: vi lagrar en låst låda och en tidpunkt då den upphör. Inget annat – ingen klartext, ingen nyckel, inga uppgifter om dig.

Klumpen laddas upp över TLS och lagras som chiffertext tillsammans med hashade inloggningsvärden, dess livslängd och en avrundad tidpunkt då den upphör. Vi sparar medvetet ingen avsändaridentitet, mottagare, IP-logg, tidpunkt för skapandet eller åtkomsthistorik. Det finns inget kontosystem som kan knyta en hemlighet till en person. Hastighetsbegränsningen bygger på en HMAC av adressen med ett salt som byts ut regelbundet, så inget från före ett byte kan kopplas till något efter.

Eftersom det lagrade objektet är meningslöst utan fröet i fragmentet ger ett serverintrång eller ett myndighetsföreläggande bara ogenomskinliga byte och hashar som inte kan omvandlas tillbaka till något.

Under överföringTLS
I lagringchiffertext + hashade nycklar + giltighetstid
Loggaringa per hemlighet

Steg 05 · Hämtning & förstöring

Första läsningen vinner – sedan raderas den

Enkelt uttryckt: när en engångslänk öppnas lämnas lådan ut en gång och serverns kopia raderas. Eller så förstör du den själv, när som helst.

Ingenting hämtas när visningssidan läses in: förfrågan skickas först vid ett riktigt klick eller tangenttryck, så länkskannrar och förhandsvisningar i chattar kan inte förbruka en hemlighet. För en engångshemlighet gör servern anspråk på raden i en enda villkorad uppdatering – exakt en förfrågan vinner – och hemligheten räknas som förbrukad från det ögonblicket. Samma webbläsare kan ladda ner igen i 15 minuter om anslutningen bryts; ingen annan kan det, och ett obekräftat anspråk förstörs, det återkallas aldrig. Tidsbegränsade hemligheter läses helt enkelt tills de upphör.

Varje hemlighet har också en privat raderingslänk. Att öppna den förstör ingenting i sig; först när du bekräftar raderas chiffertexten direkt – innan någon mottagare hinner läsa den.

Engångsatomärt anspråk, sedan förstörd
Fönster för ny nedladdning15 min, endast samma klient
Giltighetstid15 min – 14 dagar
Ägarens kontrollraderingslänk

Hotmodell

Vad shhnote kan och inte kan se

Den ärliga versionen. Här är exakt var förtroendegränsen går.

Lämnar aldrig din enhet

Det vi inte kan se

Din klartext · innehållsnyckeln och fröet · din lösenfras · om en lösenfras har angetts · vem som skapade eller öppnade en hemlighet · när den skapades · åtkomstloggar med IP-adresser. Inget av det skickas eller sparas.

Lagras på våra servrar

Det vi faktiskt har

En krypterad klump som vi inte kan öppna · dess utfyllda storleksklass · envägshashar av de värden din webbläsare använder för att hitta eller radera den · om den är en engångshemlighet eller tidsbegränsad · en avrundad tidpunkt då den upphör. Allt är oanvändbart utan fröet i din länk.

Bra att veta

De ärliga förbehållen

Den som har hela länken (och lösenfrasen, om en sådan finns) kan läsa en engångshemlighet – behandla länken som själva hemligheten. När en hemlighet har visats skriver sidan över det den kan när du lämnar den, men JavaScript kan inte garantera det; stäng fliken när du är klar. En automatiserad webbläsare som skickar äkta inmatning kan öppna en engångshemlighet på samma sätt som en människa – mottagaren hittar då ingenting, vilket är det ärliga utfallet. När en hemlighet raderas tas posten bort; krypterade rester kan finnas kvar i journaler, ledigt diskutrymme eller säkerhetskopior tills de skrivs över, som chiffertext utan nyckel. Stora hemligheter som lagras utanför databasen bär med sig tidpunkten då filen skrevs. Och som med alla webbappar litar du på koden som skickas till din webbläsare – därför är shhnote öppen källkod och går att driva själv.

Kryptografisk specifikation

Alla primitiver på ett ställe

Kryptering

AES-256-GCM

Autentiserad symmetrisk kryptering i block om 64 KiB. En 256-bitarsnyckel plus en integritetstagg per block, så manipulation eller avkortning upptäcks – den blir inte bara oläslig.

Nyckelhärledning

HKDF · Argon2id

Nycklar och identifierare härleds från fröet med HKDF-SHA-256. Valfria lösenfraser sträcks med en minneskrävande KDF, vilket gör offline-attacker med råstyrka långsamma och dyra, även på specialiserad hårdvara.

Slumptal

WebCrypto CSPRNG

Frön, nycklar, salter och nonce-värden kommer från webbläsarens kryptografiskt säkra slumptalsgenerator. Aldrig Math.random(), aldrig förutsägbart.

Nyckelförvaring

URL-fragment #

Fröet följer med efter # i din länk. Webbläsare skickar aldrig fragmentet, så det når aldrig våra servrar.

Under överföring

TLS

Bara chiffertext lämnar någonsin din enhet, och den överförs med modern TLS. Det vi tar emot är en ogenomskinlig klump som vi inte kan öppna.

I lagring

Chiffertext + hashar

Vi sparar en krypterad klump, envägshashar av dess inloggningsvärden och en avrundad tidpunkt då den upphör – ingen klartext, inga nycklar, inga metadata om avsändare eller mottagare.

Teknisk FAQ

För den säkerhetsintresserade

Hur skyddas engångsgarantin mot kapplöpningar?

Visningen kör en enda villkorad uppdatering som flyttar raden från ”aktiv” till ”gjort anspråk på”. Två samtidiga förfrågningar kan inte båda lyckas; den andra ser en post som redan är tagen och får samma svar, ”ingen hemlighet hittades”, som alla andra. Anspråket återkallas aldrig: om nedladdningen går förlorad laddar den som har anspråkstoken ner igen inom tidsfönstret, och annars förstörs hemligheten oläst.

Varför URL-fragmentet i stället för en frågeparameter?

Frågeparametrar skickas till servern och hamnar i åtkomstloggar, proxyservrar och analysverktyg. Fragmentet (efter #) är enligt URL-specifikationen definierat att stanna på klientsidan – webbläsaren lägger aldrig in det i HTTP-förfrågan. Den egenskapen är hela grunden för nollkunskapsdesignen. Efter en visning tar sidan också bort fragmentet från adressfältet och historiken.

Vad hindrar länkskannrar från att förbruka engångshemligheter i förtid?

Visningssidan är samma statiska dokument för varje hemlighet och hämtar ingenting när den läses in. Förfrågan skickas bara vid ett äkta klick eller tangenttryck – ett skriptat click() eller ett formulär som skickas automatiskt räknas inte. Automatiska skannrar (e-postskydd, förhandsvisningar i chattar, antivirusprogram) läser bara in det statiska skalet.

Kan jag granska det här eller driva det själv?

Ja. Hela källkoden är offentlig under AGPLv3, protokollet är nedskrivet i en specifikation med testvektorer som varje implementation kan kontrollera sig mot, och det finns en guide för egen drift. Du kan granska kryptografin på klientsidan och köra en egen instans, så att förtroendegränsen helt och hållet är din.

Loggas något för att förhindra missbruk?

Vi sparar inga åtkomstloggar per hemlighet och ingen IP-historik. Hastighetsbegränsningen använder en nyckelad hash av adressen med ett salt som byts ut regelbundet och nollställer alla räknare när det byts. Anmälningar om missbruk räknas per dag; det finns inga uppgifter om vilken hemlighet som anmäldes.

Tips för att dela säkert

  • Skicka lösenfrasen på ett annat sätt än länken, till exempel länken via e-post och lösenfrasen via telefon.
  • Välj den kortaste giltighetstid som fungerar för dig.
  • Använd en engångshemlighet för lösenord och annan information som ska läsas exakt en gång.

Rapportera en sårbarhet

Om du tror att du har hittat ett säkerhetsproblem på den här webbplatsen kan du mejla [email protected] och berätta det för oss i förtroende innan du berättar för någon annan. Beskriv vad du har hittat och hur det kan återskapas.

Vi kommer att:

  • svara inom 5 arbetsdagar;
  • hålla dig uppdaterad medan vi åtgärdar problemet;
  • nämna dig när vi publicerar åtgärden, om du vill.

Kom inte åt andras data, stör inte tjänsten och kör inte automatiska skanningar som belastar den hårt när du testar.

Sårbarheter i själva programvaran shhnote: se projektets säkerhetspolicy.

Skapa en hemlighet Visa källkoden på GitHub

Prova – det tar tio sekunder

Skriv något hemligt, få din engångslänk och se den försvinna.

Skapa en hemlighet