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.
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.
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.
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.
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.
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
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
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
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
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
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
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.
Prova – det tar tio sekunder
Skriv något hemligt, få din engångslänk och se den försvinna.