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.
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.
| Nyckel | Algoritm | Används till |
|---|---|---|
| K_board | AES-256-GCM, 96-bitars slumpmässig IV | Krypterar 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_owner | Ed25519 | Facilitatorns 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-id | SHA-256, första 80 bitarna, base32 | Hä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_fac | X25519 sealed box: tillfällig X25519 + HKDF-SHA256 + AES-256-GCM | Dolda kort förseglas till facilitatorns publika nyckel medan folk skriver. Bara facilitatorlänken (&f=) kan öppna dem. |
| Kortnycklar | Ed25519, en nyckel per kort | Finns bara hos författaren. Redigeringar och avslöjandet signeras med den: äkthet utan identitet. |
| Åtaganden | HMAC-SHA256 med ett 128-bitars slumpmässigt salt | Ett 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ärvaro | AES-256-GCM under K_board | Namn, avatarer och skrivindikatorer krypteras precis som allt annat. |
| Nyckelpaket | HKDF-SHA256 från passkey-PRF eller återställningskod, AES-256-GCM | Inloggade 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.
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.
| Data | Var | Kan läsas av | Sparas |
|---|---|---|---|
| Kort, röster, reaktioner, klistermärken, åtgärder, tavlans namn, rubriker på egna mallar | Durable Object-lagring, som chiffertext | Personer som har tavlans länk | Tills tavlan raderas |
| Operationens kuvert: typ, serverns sekvensnummer och tid, storlek, facilitatorräknare | Durable Object-lagring | Peel | Tills tavlan raderas |
| Deltagarnas namn, avatarer, skrivindikator | Vidarebefordras som chiffertext; hålls i minnet under anslutningen | Personer som har tavlans länk | Under anslutningen |
| Tavlans status: steg, antal deltagare och kort, katalogmallens id, låsflagga, skapande- och utgångstid | Durable Object, D1; Slack-/Teams-meddelanden om appen är installerad | Peel; din Slack-/Teams-kanal | Tavlans livstid |
| Facilitatorkonto: leverantörs-id, namn, e-post om den delas, kopplade leverantörer, skapandedatum, session | D1 | Peel | Tills du raderar kontot |
| Nyckelpaket och inslagna nycklar | D1, som chiffertext | Bara du (passkey eller återställningskod) | Tills du raderar kontot |
| Plan, prenumerationsstatus, Paddles kund- och prenumerations-id:n | D1; Paddle | Peel, Paddle | Så länge skattelagstiftningen kräver |
| Slack-/Teams-arbetsyta, kanal- och meddelande-id:n; bottoken (AES-GCM-krypterad) | D1 | Peel | Tills appen avinstalleras |
| IP-adress | Cloudflares edge, tillfälligt (leverans, hastighetsbegränsning) | Cloudflare, Peels hastighetsbegränsare | Lagras inte i våra databaser |
| Dagliga räknare (skapade tavlor, uppnådda steg) | D1 | Peel | Bara 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:readbara 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.
- 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