Hashing is het proces van het omzetten van gegevens van willekeurige grootte naar een tekenreeks van vaste lengte, gebruikt voor het controleren van integriteit en veilig opslaan van wachtwoorden. Volgens Open Web Application Security Project (OWASP, 2025) voorkomt correct gebruik van hashfuncties tot 70% van de kwetsbaarheden die verband houden met het lekken van inloggegevens. Cryptografische hashes vormen de basis van digitale handtekeningen, blockchain-technologieën en versiebeheer.
Belangrijkste punten
Hashing — het proces van het berekenen van een hashfunctie die een willekeurige set invoergegevens omzet in een bitreeks van vaste lengte, een digest of hashwaarde genoemd. In tegenstelling tot versleuteling is hashing een eenrichtingsproces: het herstellen van originele gegevens uit de hash is onmogelijk.
Cryptografische hashfuncties hebben vier verplichte eigenschappen: determinisme (dezelfde invoer geeft altijd dezelfde hash), onomkeerbaarheid (het is computationeel onmogelijk om de invoer uit de hash te herstellen), lawine-effect (verandering van één bit in de invoer verandert gemiddeld de helft van de hashbits) en botsingsbestendigheid (het is computationeel onmogelijk om twee verschillende invoeren met dezelfde hash te vinden).
Het is belangrijk om het verschil te begrijpen tussen hashen en versleutelen. Versleutelen is een tweerichtingsproces: versleutelde gegevens kunnen worden ontsleuteld met een sleutel. Hashen is een eenrichtingsproces: na omzetting kunnen gegevens niet worden hersteld. Deze eigenschap maakt hashen ideaal voor het opslaan van wachtwoorden: het systeem slaat alleen de hash op, en zelfs bij een datalek blijven wachtwoorden beschermd.
Niet alle hashfuncties zijn even geschikt voor beveiligingstaken. De indeling in cryptografische en niet-cryptografische categorieën is van cruciaal belang bij het kiezen van een algoritme voor een specifieke taak in mobiele ontwikkeling.
Deze functies zijn opzettelijk traag en complex om brute-force-aanvallen te bemoeilijken. Ze moeten bestand zijn tegen botsingen en preimage-aanvallen. De SHA-2-familie (SHA-224, SHA-256, SHA-384, SHA-512) is gecertificeerd door NIST en wordt aanbevolen voor gebruik in overheidssystemen. Voor het hashen van wachtwoorden worden bovendien de algoritmen bcrypt, scrypt en Argon2 gebruikt met instelbare complexiteit.
Deze functies zijn geoptimaliseerd voor snelheid, niet voor beveiliging. Voorbeelden: CityHash, MurmurHash, xxHash. Ze worden gebruikt in hashtabellen, gegevensdeduplicatie en controlesommen voor snelle integriteitscontrole van niet-kritieke gegevens. Het is belangrijk ze nooit te gebruiken voor het opslaan van wachtwoorden of het verifiëren van digitale handtekeningen — hoge snelheid maakt ze kwetsbaar voor brute-force-aanvallen.
| Type | Voorbeelden | Toepassingsgebied |
|---|---|---|
| Cryptografisch | SHA-256, SHA-3, bcrypt | Wachtwoorden, handtekeningen, TLS |
| Niet-cryptografisch | MurmurHash, xxHash | Hashtabellen, cache |
| Wachtwoord-KDF | bcrypt, scrypt, Argon2 | Wachtwoordopslag |
Laten we de meest gebruikte hashalgoritmen in moderne mobiele ontwikkeling bekijken. Elk heeft zijn sterke en zwakke punten.
SHA-256 — het symbool van moderne cryptografie, aanbevolen door NIST in het kader van de FIPS 180-4-standaard. Het algoritme produceert een 256-bit digest en is het hoofdbestanddeel van TLS-protocollen, blockchain-netwerken en versiebeheersystemen. Volgens het rapport van NCC Group (2025) wordt SHA-256 gebruikt in 96% van de TLS-certificaten voor het ondertekenen van certificate transparency.
SHA-3 — de nieuwste familie hashfuncties, gestandaardiseerd door NIST in 2015 als FIPS 202. In tegenstelling tot SHA-2, gebouwd op de Merkle–Damgård-structuur, is SHA-3 gebaseerd op een andere Keccak-constructie met een sponsfunctie. Dit maakt SHA-3 bestand tegen aanvallen die in de toekomst op SHA-2 zouden kunnen verschijnen. Voor mobiele ontwikkelaars is SHA-3 beschikbaar via standaard cryptografische bibliotheken vanaf Android 7.0 en iOS 13.
import java.security.MessageDigest
fun hashWithSHA256(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val hashBytes = digest.digest(input.toByteArray())
return hashBytes.joinToString("") { String.format("%02x", it) }
}
Voor het opslaan van wachtwoorden zijn algemene cryptografische hashes niet voldoende — ze zijn te snel. bcrypt is speciaal ontworpen voor het hashen van wachtwoorden: het bevat zout en een kostenparameter die de rekentijd regelt. Het verhogen van de kosten met een factor 2 verdubbelt de hashtijd, waardoor brute-force-aanvallen ineffectief worden, zelfs op krachtige hardware.
import at.favre.lib.crypto.bcrypt.BCrypt
fun hashPassword(password: String): String {
return BCrypt.create()
.hashToString(BCrypt.MIN_COST, password.toCharArray())
}
fun verifyPassword(password: String, hash: String): Boolean {
val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
return result.verified
}
Argon2 — winnaar van de Password Hashing Competition (2015), aanbevolen door OWASP als de beste keuze voor het hashen van wachtwoorden. Argon2id — een variant die bestand is tegen side-channel-aanvallen en time-memory trade-off-aanvallen. In tegenstelling tot bcrypt kan Argon2 de uitvoertijd, geheugengebruik en paralellisme afzonderlijk configureren, wat flexibele bescherming biedt tegen verschillende soorten aanvallen.
Hashing lost veel praktische taken op in mobiele ontwikkeling — van gebruikersauthenticatie tot het controleren van de integriteit van gedownloade bestanden. Laten we de belangrijkste gebruiksscenario’s bekijken.
Het belangrijkste scenario — veilige wachtwoordopslag aan de serverzijde. Bij registratie stuurt de app het wachtwoord naar de server, waar het met zout wordt gehasht met bcrypt of Argon2 en in de database wordt opgeslagen. Bij inloggen hasht de server het ingevoerde wachtwoord en vergelijkt het met de opgeslagen hash. OWASP raadt het gebruik van Argon2id aan met parameters: tijd 2 seconden, geheugen 64 MB, paralellisme 4.
Bij het downloaden van grote bestanden, zoals OBB-pakketten of inhoudsupdates, kunnen mobiele apps hun integriteit controleren via hashing. De server publiceert de SHA-256-hash van het bestand en de app berekent de hash van de gedownloade gegevens en vergelijkt ze. Dit garandeert dat het bestand niet is beschadigd of vervangen tijdens de overdracht. Volgens Google Play Console (2025) voorkomt hashverificatie van gecertificeerde apps tot 99,9% van de aanvallen met beschadigde downloads.
Hashes worden actief gebruikt voor het bouwen van efficiënte caches en gegevensdeduplicatie. Het adres van een afbeelding of JSON-antwoord wordt gehasht en gebruikt als cachesleutel: bij een herhaald verzoek vergelijkt het systeem de hashes en retourneert het opgeslagen resultaat als de gegevens niet zijn gewijzigd. Voor deze taak zijn niet-cryptografische hashfuncties zoals MurmurHash of xxHash geschikt, die maximale prestaties leveren.
import java.security.MessageDigest
fun calculateFileHash(fileBytes: ByteArray): String {
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(fileBytes)
return hash.joinToString("") { String.format("%02x", it) }
}
fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
val actualHash = calculateFileHash(data)
return actualHash == expectedHash
}
Zelfs ervaren ontwikkelaars maken fouten bij het werken met hashing. Laten we de meest voorkomende problemen bekijken die alle voordelen van cryptografische bescherming teniet kunnen doen.
MD5 en SHA-1 — verouderde algoritmen waarvoor praktische botsingsaanvallen bestaan. MD5 werd in 2004 gekraakt door een groep Chinese onderzoekers (botsing binnen een uur). SHA-1 werd in 2017 gekraakt door het team van Google en Centrum Wiskunde & Informatica (SHAttered-aanval). Het gebruik van deze algoritmen in nieuwe projecten wordt volgens de OWASP-classificatie beschouwd als een grove beveiligingsfout.
Het hashen van wachtwoorden zonder zout — een kritieke kwetsbaarheid. Zout is een willekeurige tekenreeks, uniek voor elke gebruiker, die aan het wachtwoord wordt toegevoegd vóór hashen. Zonder zout geven twee identieke wachtwoorden dezelfde hash, waardoor regenboogtabellen kunnen worden gebruikt voor brute-force. OWASP raadt het gebruik aan van cryptografisch sterk zout met een lengte van ten minste 32 bytes, afzonderlijk gegenereerd voor elke gebruiker.
Zelfs bij gebruik van bcrypt of Argon2 kan de bescherming worden verzwakt door een te lage kostenparameter te kiezen. Volgens OWASP (2025) moet het minimum aantal bcrypt-iteraties 10 zijn (2^10 = 1024 iteraties), en voor Argon2id — rekentijd van ten minste 1 seconde op het doelplatform. Te lage parameters maken brute-force-aanvallen praktisch uitvoerbaar op GPU-farms.
Veelgestelde vragen
Hashen — een eenrichtingsproces waarvan het resultaat niet kan worden teruggedraaid naar originele gegevens. Versleutelen is een tweerichtingsproces: versleutelde gegevens kunnen worden ontsleuteld met een sleutel. Hashen wordt gebruikt voor wachtwoordopslag en integriteitscontrole, versleutelen voor vertrouwelijke overdracht van gegevens tussen client en server.
OWASP beveelt Argon2id aan als de beste keuze voor het hashen van wachtwoorden vanwege de configureerbare bescherming tegen GPU-aanvallen en side-channel-aanvallen. Alternatieven: bcrypt (bewezen en eenvoudig in te stellen), scrypt (bestand tegen ASIC-aanvallen) en PBKDF2. SHA-256 en SHA-512 zijn niet geschikt voor wachtwoorden — ze zijn te snel en beschermen niet tegen massale brute-force.
Botsing — een situatie waarin twee verschillende invoergegevenssets dezelfde hash produceren. Voor cryptografische hashfuncties moet het vinden van botsingen computationeel onmogelijk zijn. De kans op een SHA-256-botsing voor twee willekeurige berichten is bijvoorbeeld ongeveer 1 op 2^128 — een verwaarloosbaar kleine waarde.
Nee, bcrypt neemt automatisch zout op in zijn algoritme. Bij aanroep van BCrypt.hashToString() genereert de bibliotheek cryptografisch sterk zout van 16 bytes en voegt het samen met de hash en de kostenparameter in de uitvoertekenreeks in. Scrypt en Argon2 werken op dezelfde manier. Dit is een van de redenen waarom experts aanbevelen om gespecialiseerde KDF te gebruiken in plaats van algemene hashfuncties voor wachtwoordbeveiliging.
Ja, hashes worden gebruikt voor het maken van witte en zwarte lijsten van bestanden. Antivirusdatabases bevatten hashes van bekende malware. Aanvallers kunnen echter één byte in een programma wijzigen, waardoor de hash volledig verandert. Daarom gebruiken moderne systemen fuzzy-hashing (SSDeep, TLSH), die semantisch vergelijkbare bestanden vindt, niet alleen exacte overeenkomsten.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook