Een unieke en veilige ID maken in php

Als webdesigner wil je gebruik maken van een unieke ID. Dit kan een unieke sessie variabele zijn, of een uniek paswoord dat gegenereerd wordt door het systeem. PHP heeft enkele ingebouwde functies die hierbij kunnen helpen. Maar met een beetje creativiteit kom je zelf op een uniek en veilige systeem om unieke IDs te maken. Een overzicht in dit artikel.

Ingebouwde functies RAND() en UNIQID()

RAND()

Een eerste idee zou kunnen zijn om een random nummer te genereren via de RAND() functie. Deze optie veruit de snelste, maar niet waterdicht. De kans dat er 2 dezelfde nummers gegenereed worden is immers niet onbestaande. Ze neemt zelfs toe naarmate meer random nummers gegenereed worden. Deze functie moeten we dus eigenlijk verwerpen. Mocht je toch enkel een random nummer nodig hebben, gebruik dan de nieuwe MT_RAND() functie. Deze gebruikt de Mersenne Twister algorythm (1997) en zou tot 4 maal sneller zijn dan de gewone RAND().

UNIQID()

Een andere ingebouwde functie lijkt meer op ons lijf geschreven: UNIQID(). Deze php functie genereerd een unieke ID van 13 tekens op basis van de tijd, uitgedrukt in microseconden, waardoor het zeker geen 2 dezelfde nummers zal genereren. Toch huist er een kleine adder onder het gras, namelijk op vlak van veiligheid. Het is immers niet zo moeilijk om ongeveer te weten wanneer deze functie een unieke ID heeft aangemaakt. Er zijn slechts 60.000 microseconden in een minuut, dus wil men de unieke ID achterhalen, hoeven er slechts 60.000 iteraties gemaakt te worden, hetgeen met de huidige computerkracht kinderspel is. We zijn dus op zoek naar iets creatiever. We moeten de variabiliteit verhogen en de traceerbaarheid verlagen.

Uitbreiden van de UNIQID() functie: variabiliteit verhogen

Een random prefix toevoegen

We kunnen een prefix toevoegen. In ons geval kunnen we RAND() en UNIQID() combineren om de variabiliteit te verhogen. Je hoeft de prefix zelfs niet eens zelf te bepalen, want de UNIQID() functie heeft ingebouwd een prefix parameter. In ons geval willen we een random nummer als prefix en dit schrijven we als: UNIQID(MT_RAND())

Extra parameter toevoegen

Om extra zeker te zijn laat de UNIQID() functie toe de output uit te breiden van 13 tot 23 tekens. Hoe meer tekens, hoe meer variabiliteit. Deze uitbreiding scheelt zelfs niets in rekentijd, dus alle reden om het wel te doen. Onze unieke ID ziet er nu als volgt uit: UNIQID(MT_RAND(),true)

Encryptie doorvoeren: traceerbaarheid verlagen

MD5() op UNIQID() = slecht idee

Een populaire methode om encrypties te beschermen is het toevoegen van al dan niet random prefixen. In vakjargon heet dit: 'salten', maar wordt vaak toegepast vooraleer een paswoord omgezet wordt in een andere combinatie van letters en cijfers. Deze stap is een 'hash' en kan uitgevoerd worden door de MD5() ingebouwde php functie. Dit gaan we zeker niet doen, want als we een unieke nummer door elkaar gooien, krijg je alleen maar meer kans dat dit voor 2 verschillende getallen op dezelfde manier gebeurt. We verliezen hierbij dus de volledige functionaliteit.

UNIQID() op MD5() = goed idee

Door extra parameters toe te voegen, hebben we nu de variabiliteit drastisch verhoogd waardoor we het flink moeilijker gemaakt hebben om onze unieke ID te raden. We gaan nu een encryptie doorvoeren, maar niet van de uitkomst van de UNIQID(), zoals eerder besproken, maar van de prefix die de functie gevoederd wordt. Een populaire encryptie is de eerder vernoemde MD5() functie. Die haalt de input helemaal door elkaar en spuwt iets totaal anders uit in de vorm van 8 tekens. Er bestaat geen omgekeerde functie, waardoor de bewerking onomkeerbaar is. Jammer genoeg bestaan er ondertussen databanken van MD5() resultaten die online zijn. Haal maar eens de kernwoorden 'MD5 Decrypt' door een zoekmachine.

Conclusie:

Onze nieuwe functie, die een unieke en veilige ID genereerd, ziet er als volgt uit: UNIQID(MD5(MT_RAND()),true)