Rainbow table
Een rainbow table is een eenvoudige tabel met allerlei mogelijke wachtwoorden en de hashes van deze wachtwoorden. Hij wordt gebruikt om wachtwoorden te testen op veiligheid, of om ze te kraken. De techniek is vele malen sneller dan de brute force-techniek, waarbij de hashes van de wachtwoorden nog moeten worden berekend. De rainbow table is  samengesteld volgens Philippe Oechslins faster time-memory trade-off technique. Het maken van een dergelijke tabel kost weliswaar veel rekentijd en opslagcapaciteit, maar zodra de tabel berekend is, kan een wachtwoord-hash snel omgezet worden in het gebruikte wachtwoord.

Voorbeeld
Een voorbeeld van een hash is de LM-hash, die wordt gebruikt voor gebruikerswachtwoorden in oudere versies van Microsoft Windows. Een LM-hash is bijvoorbeeld CD76B79FAAD7028D. Het oorspronkelijke wachtwoord van deze hash is wiki.

Een nadeel van de LM-hash is dat het werkt met wachtwoorden tot en met zeven tekens lang. Indien een wachtwoord tussen de 7 en 14 tekens lang is, worden er twee hashes gebruikt van elk maximaal zeven tekens.

Stel een wachtwoord is wikipedia. Dan wordt de eerste hash van 82537CDC85403482 (van wikiped) en de tweede hash 5E153EE0AE0FFBAF (van ia). Dit leidt dus tot een zwakte in de beveiliging van een systeem voor wachtwoorden tot 14 tekens. Vanaf 15 tekens maakt Windows gebruik van de NTLM-hash, die uit één deel bestaat en veiliger is.

Verdediging tegen een rainbowtable-aanval
Rainbow tables kunnen gebruikt worden om wachtwoorden te kraken.
Een efficiënte methode om dit tegen te gaan is gebruik van zogezegd zout (salt).
Dit is het toevoegen van een willekeurige tekenreeks aan het wachtwoord voordat het gehasht wordt.
De salt wordt samen met de hash van het wachtwoord bewaard.

Een voorbeeld (als '+' het concatenatieteken is):

In plaats van

passwordHash = hash(password)

gebruikt men

saltPasswordHash = hash(password + salt)

of

saltPasswordHash = hash(hash(password) + salt)

Het voordeel van deze verdediging is dat een hacker voor iedere salt een aparte rainbowtable moet maken, wat veel rekenwerk vereist. Hiervoor dient wel voor elk wachtwoord een andere salt gebruikt te worden.

Er kan ook een globale salt worden toegevoegd die voor elk wachtwoord hetzelfde is. Als deze salt op een andere plek wordt opgeslagen (bijvoorbeeld in de broncode), dan voegt dit een extra laag aan veiligheid toe, omdat voor het bruteforcen van de hashes dan ook de globale salt moet worden verkregen.

Een salt kan worden bepaald door (een deel van een hash van) een willekeurige tekenreeks te nemen. 

Cryptografie