För informationssäkerhetsteam och appgranskare

Säkerhet hos Peel

Kortversionen: tavlans innehåll krypteras i webbläsaren med en nyckel som finns i länkens fragment, så våra servrar lagrar och vidarebefordrar chiffertext som de inte kan läsa. Här är exakt hur, och var gränserna går.

Sammanfattning

  • Korttext, namn, tavlornas titlar, röster och klistermärken krypteras med AES-256-GCM under en tavelnyckel som skapas i webbläsaren. Nyckeln följer med i URL-fragmentet (#k=) och skickas aldrig till någon server.
  • Facilitatoråtgärder, tavlans huvud och ögonblicksbilder signeras med facilitatorns Ed25519-nyckel. Tavlans id härleds från den nyckeln, så klienterna upptäcker om nyckeln byts ut.
  • Dolda kort är förseglade till facilitatorn (X25519 sealed box) fram till avslöjandet och bundna av saltade åtaganden, så att avslöjad text inte kan bytas ut.
  • Anonymt som standard: operationer bär inget författar-id; röster och reaktioner använder ett slumpmässigt id per tavla.
  • Deltagare autentiserar sig aldrig. Inga analys-SDK:er, inga annonser, inga tredjepartsskript utom Paddle.js på kassasidan.
  • Bara Cloudflare. Tavlor som ingen har gjort anspråk på raderas 60 dagar efter senaste besöket.

Så flödar datan

Fragmentet i en URL (allt efter #) hanteras av webbläsaren och ingår inte i HTTP-förfrågan. Där lägger Peel tavlans nyckel.

Dataflöde: nyckeln läses lokalt från länken; bara chiffertext och minimal metadata går över nätverket.

Hotmodell

Vi bygger så att en helt komprometterad eller nyfiken server, även vår egen, får veta så lite som möjligt om vad ett team säger.

Vad vi skyddar

  • Korttext, GIF-val och, i läget med namn, författarens namn.
  • Deltagarnas namn och avatarer, tavlans namn och rubriker på egna mallar.
  • Vem som röstade eller reagerade på vad, och vem som skrev vilket kort.
  • Retrons integritet: steg, avslöjanden och facilitatorns beslut kan inte förfalskas.

Motståndare vi räknar med

  • Våra egna servrar, en illasinnad insider eller någon som bryter sig in i vår lagring: de får chiffertext och metadata.
  • En angripare i nätverket: TLS överallt; nyckeln korsar aldrig nätverket.
  • En server som byter nycklar: tavlans id härleds från facilitatorns publika nyckel, och klienterna verifierar det signerade huvudet.
  • En deltagare som vill tjuvkika eller förfalska: dolda kort är förseglade till facilitatorn; facilitatoroperationer kräver facilitatorns signatur; redigering av kort kräver kortets nyckel.
  • En facilitator som publicerar åt en författare som är offline: åtagandena hindrar hen från att ändra texten.

Utanför ramen, ärligt talat

  • Alla som har deltagarlänken kan läsa tavlan. Länken är åtkomstkontrollen. Dela den som om det vore tavlan själv.
  • En komprometterad enhet, ett skadligt webbläsartillägg eller någon som tittar över axeln.
  • Trafikanalys: servern ser tidpunkter, storlekar och antal (se datakartan).
  • Överbelastning från serverns sida: den kan släppa eller fördröja meddelanden, men inte läsa eller förfalska dem.

Kryptografi

Alla primitiver kommer från webbläsarens WebCrypto-API. Ingen egenutvecklad kryptografi, inga kryptobibliotek från tredje part.

NyckelAlgoritmAnvänds till
K_boardAES-256-GCM, 96-bitars slumpmässig IVKrypterar varje operation, ögonblicksbild och närvarouppdatering. Tilläggsdatan binder tavlans id, operationstyp och operations-id, så chiffertext kan inte spelas upp i en annan tavla eller på en annan plats. Finns bara i länkens fragment #k=.
K_ownerEd25519Facilitatorns befogenhet. Signerar facilitatoroperationer (steg, timer, spotlight, mall, inställningar, öppna röster, dölja ett kort), tavlans huvud och ögonblicksbilder. En strikt ökande räknare blockerar återuppspelning. Finns bara i facilitatorlänken (&o=).
Tavel-idSHA-256, första 80 bitarna, base32Härleds från facilitatorns publika nyckel, så id:t i sig bevisar vilken nyckel som äger tavlan. Klienter avvisar ett huvud vars nyckel inte hashar till id:t.
K_facX25519 sealed box: tillfällig X25519 + HKDF-SHA256 + AES-256-GCMDolda kort förseglas till facilitatorns publika nyckel medan folk skriver. Bara facilitatorlänken (&f=) kan öppna dem.
KortnycklarEd25519, en nyckel per kortFinns bara hos författaren. Redigeringar och avslöjandet signeras med den: äkthet utan identitet.
ÅtagandenHMAC-SHA256 med ett 128-bitars slumpmässigt saltEtt dolt kort publicerar ett åtagande för sitt innehåll. Vid avslöjandet publiceras innehållet och saltet, och varje klient kontrollerar dem, så ingen kan byta ut texten.
NärvaroAES-256-GCM under K_boardNamn, avatarer och skrivindikatorer krypteras precis som allt annat.
NyckelpaketHKDF-SHA256 från passkey-PRF eller återställningskod, AES-256-GCMInloggade facilitatorer kan synka tavelnycklar mellan enheter. Paketet krypteras på enheten; servern lagrar bara chiffertext och inslagna nycklar.

Signerade meddelanden är domänseparerade (till exempel peel/sig/v1, peel/header/v1, peel/snap/v1) så att en signatur för ett syfte inte kan återanvändas för ett annat.

Dolda kort och avslöjandet

  1. Medan författaren skriver förseglar hens webbläsare kortet till facilitatorns X25519-nyckel och publicerar ett saltat åtagande. Klartexten stannar på författarens enhet.
  2. Andra deltagare ser ett dolt kort: de kan inte dekryptera det, och det kan inte servern heller.
  3. Facilitatorns webbläsare kan öppna förseglade kort (förhandsvisningen ”👁 bara du”).
  4. Vid avslöjandet publicerar varje författare kortet igen, krypterat med K_board och signerat med kortnyckeln, tillsammans med saltet.
  5. Om en författare är offline publicerar facilitatorn åt hen. Varje klient kontrollerar åtagandet, så texten måste stämma med det författaren skrev.

Eftersom facilitatorn tekniskt sett kan förhandsgranska visar varje tavla etiketten ”facilitatorn kan förhandsgranska” för alla medan korten är dolda. Det är ingen inställning som kan döljas.

Anonymitet

  • Operationer bär inget författar-id. Servern kan inte koppla ett kort till en person, och som standard kan inte heller facilitatorn det.
  • Röster och reaktioner kopplas till ett slumpmässigt id per tavla som inte är länkat till något namn.
  • Skrivindikatorer visar att någon skriver, aldrig vad.
  • Läget med namn är en uttrycklig tavelinställning; författarens namn följer då med inuti det krypterade kortet.
  • Deltagare loggar aldrig in, så det finns inget konto att koppla ihop.

Datakarta

Allt vi har, var det finns, vem som kan läsa det och hur länge det sparas.

DataVarKan läsas avSparas
Kort, röster, reaktioner, klistermärken, åtgärder, tavlans namn, rubriker på egna mallarDurable Object-lagring, som chiffertextPersoner som har tavlans länkTills tavlan raderas
Operationens kuvert: typ, serverns sekvensnummer och tid, storlek, facilitatorräknareDurable Object-lagringPeelTills tavlan raderas
Deltagarnas namn, avatarer, skrivindikatorVidarebefordras som chiffertext; hålls i minnet under anslutningenPersoner som har tavlans länkUnder anslutningen
Tavlans status: steg, antal deltagare och kort, katalogmallens id, låsflagga, skapande- och utgångstidDurable Object, D1; Slack-/Teams-meddelanden om appen är installeradPeel; din Slack-/Teams-kanalTavlans livstid
Facilitatorkonto: leverantörs-id, namn, e-post om den delas, kopplade leverantörer, skapandedatum, sessionD1PeelTills du raderar kontot
Nyckelpaket och inslagna nycklarD1, som chiffertextBara du (passkey eller återställningskod)Tills du raderar kontot
Plan, prenumerationsstatus, Paddles kund- och prenumerations-id:nD1; PaddlePeel, PaddleSå länge skattelagstiftningen kräver
Slack-/Teams-arbetsyta, kanal- och meddelande-id:n; bottoken (AES-GCM-krypterad)D1PeelTills appen avinstalleras
IP-adressCloudflares edge, tillfälligt (leverans, hastighetsbegränsning)Cloudflare, Peels hastighetsbegränsareLagras inte i våra databaser
Dagliga räknare (skapade tavlor, uppnådda steg)D1PeelBara aggregerat, inga identifierare

Vad vår server kan och inte kan göra

Den kan

  • Se operationstyper, storlekar, tidpunkter, steget, antal deltagare och kort, katalogmallens id och låsflaggan.
  • Släppa, fördröja eller vägra leverera operationer (överbelastningsattack).
  • Se IP-adresser vid nätverkets kant.
  • Räkna tavlor och uppnådda steg, aggregerat.
  • Radera en tavla (utgång, rapporter om missbruk).

Den kan inte

  • Läsa korttext, namn, tavlornas titlar, rubriker på egna mallar, röster eller klistermärken.
  • Läsa dolda kort före avslöjandet (och inte heller efteråt).
  • Förfalska facilitatoråtgärder: de kräver facilitatorns signatur.
  • Byta in egna nycklar: tavlans id avslöjar det.
  • Ändra ett korts avslöjade text: åtaganden och kortsignaturer avslöjar det.
  • Avgöra vem som skrev vilket kort.

Som med alla webbappar litar du på koden vi levererar. Vi håller den ytan liten: en strikt Content Security Policy, script-src begränsad till vårt eget ursprung, inga tredjepartsskript, och protokollet kan granskas på begäran.

Slack och Microsoft Teams

  • Meddelanden bär tavlans länk och metadata (titel, steg, antal). Korttext skickas bara när facilitatorn postar en sammanfattning och bekräftar den.
  • Gå med-kortet innehåller deltagarlänken, som inkluderar nyckeln. Alla som kan läsa kanalen kan gå med, precis som om man klistrade in länken där.
  • Förhandsvisningar av länkar visar bara steg och antal, aldrig innehåll.
  • Slack-behörigheter: commands, chat:write, links:read, links:write; users:read bara när ett team slår på omnämnanden.
  • Bottokens krypteras i vila (AES-GCM, nyckeln förvaras som en Worker-hemlighet). Slacks förfrågningssignaturer och Bot Framework-tokens verifieras vid varje förfrågan.
  • Om appen avinstalleras upphör all postning och dess tokens raderas.

Webb och infrastruktur

  • Bara Cloudflare: Pages, Workers, Durable Objects, D1, R2 och KV på 1801 Labs konto. Inga andra servrar.
  • TLS överallt, HSTS och en strikt Content Security Policy.
  • Inga analys-SDK:er, inga annonser, inga tredjepartsskript. Det enda undantaget är Paddle.js, som bara laddas på kassasidan.
  • En enda cookie, bara för inloggade facilitatorer: peel_session, httpOnly, Secure, SameSite=Lax.
  • GIF-sökning och media går via vårt API, så deltagarnas IP-adresser når aldrig GIPHY.
  • Typsnitt och resurser driftas av oss själva. Inga typsnitt från CDN, inga spårningspixlar.
  • Hastighetsbegränsningar per IP och per tavla; rapporter om missbruk och facilitatorlås.

Konton och lagringstid

  • Deltagare autentiserar sig aldrig. Facilitatorer loggar in med Google (eller Entra ID via Teams) bara för att spara tavlor eller använda betalfunktioner.
  • Ett konto lagrar ett id, namnet och e-postadressen från leverantören samt ett krypterat nyckelpaket som låses upp med en passkey (WebAuthn PRF) eller en återställningskod. Inloggning ger ägarskap, inte åtkomst till innehållet.
  • När du gör anspråk på en tavla bevisas ägarskapet med en facilitatorsignatur. Tavelnycklar skickas aldrig.
  • Tavlor utan konto raderas 60 dagar efter senaste besöket; varje besök nollställer klockan. Larm i Durable Objects raderar lagringen.
  • När du raderar ditt konto raderas sessioner, nyckelpaketet och ditt bibliotek, och dina tavlor får tillbaka gränsen på 60 dagar.

Ansvarsfullt avslöjande

Hittat något? Berätta för oss först så samarbetar vi med dig. Vi bekräftar rapporter inom tre arbetsdagar.

[email protected]

  • Ge oss rimlig tid (vi siktar på 90 dagar) att åtgärda innan du offentliggör något.
  • Testa med dina egna tavlor och konton. Kom inte åt andras data och försämra inte tjänsten.
  • Vi vidtar inga rättsliga åtgärder mot forskning i god tro som följer de här reglerna.
  • Maskinläsbar kontakt: /.well-known/security.txt.

Kunder på Company-planen får ett säkerhetsgranskningspaket (svar på frågeformulär, underbiträden, dataflöden). DPA · Integritet