Beveiliging

Laatst bijgewerkt op 18 september 2026

In het kort

Geen keurmerken, geen vage geruststelling. Dit is wat er staat en hoe het werkt.

Je wachtwoord

We slaan je wachtwoord niet op. Wat er in de database staat is een hash die is gemaakt met argon2id, op de instellingen die OWASP aanraadt: 19 MiB geheugen en twee rondes. Argon2id is expres traag en geheugenhongerig, zodat iemand die de database zou buitmaken er niet doorheen kan rekenen.

Praktisch betekent dat: wij kunnen je wachtwoord niet uitlezen, niet aan je opsturen en niet aan iemand anders geven. Vergeten? Dan zetten we een nieuwe, we kunnen de oude niet opzoeken.

De controle op gelekte wachtwoorden

Kies je een wachtwoord, dan controleren we of het in een bekend datalek voorkomt. Dat gebeurt zonder je wachtwoord ergens naartoe te sturen.

Het werkt zo: van je wachtwoord wordt lokaal een hash gemaakt en daarvan sturen we alleen de eerste vijf tekens naar de dienst die de lekken bijhoudt. Die stuurt alle hashes terug die met die vijf tekens beginnen, honderden, en het vergelijken gebeurt op onze server. De andere kant weet dus nooit welk wachtwoord het was, en zelfs niet of er een treffer was.

Doet die dienst het even niet, dan gaat je registratie gewoon door. Een storing bij een ander mag niet betekenen dat jij geen account kunt maken.

Onderweg

Al het verkeer tussen de app en de server gaat over TLS. Er is geen onversleutelde variant om op terug te vallen; een verzoek over gewoon HTTP wordt doorgestuurd naar de versleutelde versie voordat er iets van inhoud over de lijn gaat.

Inloggen en ingelogd blijven

Je blijft ingelogd met twee soorten tokens: een kortlevende om verzoeken mee te doen en een langlevende om die eerste mee te vernieuwen. Die tweede wordt bij elk gebruik vervangen. Wordt een verbruikt token nog een keer aangeboden, wat niet per ongeluk kan gebeuren, dan behandelen we dat als diefstal en beëindigen we alle sessies van dat account tegelijk.

Bij elk verzoek wordt bovendien opnieuw in de database gekeken of het account nog bestaat. Daardoor werkt het verwijderen van een account direct, en niet pas als het laatste token vanzelf verloopt.

Wie bij wat kan

De database scheidt per gebruiker. Elk bier, elke partij en elke groep hangt aan één account, en de app vraagt nooit iets op zonder dat account erbij. Een gedeelde verzameling of een ruil is een expliciete uitzondering die jij zelf aanzet, en die geeft alleen toegang tot wat je deelt.

De catalogus is het enige wat iedereen ziet, en dat is de bedoeling: het gaat om feiten over bieren, niet over mensen.

Misbruik tegenhouden

Op inloggen, registreren, wachtwoordherstel en het versturen van mail zitten limieten per adres en per IP. Die zijn er om te voorkomen dat iemand wachtwoorden kan raden of een mailbox kan volgooien. Een geweigerd verzoek zegt niet wélke limiet is geraakt, want dat zou zelf weer informatie prijsgeven.

Verder zegt geen enkel antwoord van de server of een e-mailadres een account heeft. Registreren met een bestaand adres geeft precies hetzelfde antwoord als registreren met een nieuw adres. Het verschil staat alleen in de mailbox van de persoon die het mag weten.

Back-ups

Elke nacht wordt de database gedumpt en daarna meteen teruggelezen om te controleren of de dump bruikbaar is. Een back-up waarvan niemand weet of hij werkt is geen back-up. We bewaren veertien dagelijkse en twaalf maandelijkse kopieën, en de herstelprocedure is een keer echt uitgevoerd tegen een aparte database.

Waar het staat

De server en de mail staan binnen de Europese Unie en vallen onder de AVG. Er gaan geen gegevens naar landen daarbuiten.

Openbare lijsten zijn openbaar

Een lijst met een openbare code is bedoeld om gevonden te worden. Hij heeft een eigen adres, staat in de gids en is vindbaar via zoekmachines. Er is geen tweede schakelaar die een openbare lijst ongelijst maakt: publiceren is de beslissing, en de code weghalen in de app is hoe je het terugdraait.

Dat is een verandering. De deelpagina had noindex en de code stond in het deel van de URL dat nooit een server bereikt. Allebei waren ze er om een openbare pagina moeilijk vindbaar te maken, en een gids is daar het tegenovergestelde van.

Twee dingen zijn behouden nu de code in het adres staat, omdat ze de link beschermen in plaats van de pagina te verbergen:

Privé delen verandert hier niets door. Een uitnodigingscode is geen openbare code: die lijsten staan niet in de gids, worden niet geïndexeerd en zijn alleen bereikbaar voor wie jij hebt uitgenodigd.

Wat een openbare pagina laat zien

Wat de eigenaar heeft gedeeld: de naam van de lijst, de weergavenaam en de bieren op de plekken die zijn gekozen. Niet het e-mailadres, niet het account, en niets wat niet in die lijst is gezet.

Staat er iets op een openbare pagina dat er niet hoort, dan staat er een meldknop op de pagina zelf. Daar is geen account voor nodig en er wordt niets over jou bewaard.

Wat we hiermee niet claimen

Eerlijk is eerlijk. Dit zijn de dingen die hierboven níet worden beweerd, zodat je ze niet hoeft te veronderstellen:

Iets gevonden?

Zie je een gat, mail dan cheers@back.beer. Meld het aan ons voordat je het elders deelt, geef ons de kans het te repareren, en haal geen gegevens van anderen op om je punt te maken. We reageren, we nemen het serieus, en we zeggen erbij wat we ermee hebben gedaan.

Deze pagina is opgesteld in het Nederlands. De Engelse versie is een vertaling ter informatie. Wijken ze van elkaar af, dan geldt de Nederlandse tekst.