PIN Login

Door Mark L, 19 jaar geleden, 10.392x bekeken

Edit: Niet geheel veilig mits Man-In-The-Middle ook het plaatje kan opvangen.

Als eerste, wie is de Man-In-The-Middle?
Als je gegevens stuurt over een onbeveiligde lijn, dan kan iemand tijdens het versturen van de gegevens deze gegevens onderscheppen. Dit is natuurlijk niet leuk als dit bij inloggen gebeurd, omdat je er dan inloggegevens uitlekken. De Man-In-The-Middle kan deze inloggegevens opnieuw gebruiken.

Wat kun je doen tegen de Man-In-The-Middle?
Nou, eigenlijk niet veel, het enige dat je kunt doen is de gegevens encrypten. Maar dit moet Cliëntside gebeuren. Oplossing: JavaScript. Maar hier zit een nadeel aan: Er zijn mensen die JavaScript uit hebben staan en dan werkt het dus niet.
Dan heb je nog een tweede optie: een beveiligde lijn (HTTPS). Hiervoor heb je echter een certificaat voor nodig en deze kost geld. Als je een goede beveiliging wilt hebben raad ik dit je toch sterk aan!
Nu heb ik zelf een script gemaakt met een Serverside bescherming tegen de Man-In-The-Middle. Nu zul je je afvragen, hoe kan dat, want de gegevens moeten toch eerst naar de server gaan voor je ze Serverside kunt beschermen.
Toch is het mogelijk, door mensen van te voren bepaalde opties te geven (Serverside). Zie het als een PINcode. Je hebt 10 opties: Getallen van 0 tot 9. Nu is een beveiliging met 10 opties natuurlijk niet sterk, je hebt 1/10e kans om het goed te doen, als je gokt. Daarom moet je meerdere getallen invoeren. Hoe meer getallen hoe minder kans op een 'goede gok'.
Het aantal opties is te berekenen met 10^n, waarin n het aantal getallen zijn, dus als je 4 getallen moet in te voeren heb je 10^4 opties, dus 10 000 opties. Dit maakt 1/10 000e kans op een 'goede gok'.

Hoe maak je dan een PIN, zonder dat de Man-In-The-Middle hier iets aan heeft?
Nou, hieronder staat een vereenvoudigde versie van het script dat ik gemaakt heb.
Ik zal het principe uitleggen:
Je maakt een array en vult deze met waarden van 0 t/m 9. Deze gooi je door elkaar.
Nu komt er bijvoorbeeld zoiets uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$array = array(
0 => 4,
1 => 2,
2 => 9,
3 => 0,
4 => 1,
5 => 7,
6 => 3,
7 => 8,
8 => 5,
9 => 6
);

Nu zet je deze d.m.v. de GD Lib. in een plaatje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
[4][2][9]
[0][1][7]
[3][8][5]
[   6   ]

De array sla ik op in een Sessie. De Sessie kan De-Man-In-The-Middle niet lezen, want de sessie blijft alleen op de server.

Nu gebruik ik dit plaatje als een <input type="image">. Het voordeel van dit is dat je de precieze plek krijgt doorgestuurd waar de gebruiker klikt (x en y).

Nu vernieuwt de pagina en krijgen wij de coördinaten binnen waar de gebruiker gedrukt heeft. Wij weten nog precies hoe het plaatje eruit zag, wij hebben immers de waarden in de sessie staan.

Nu slaan we het getal, waar de gebruiker op heeft geklikt, op in een sessie-variabele en zo komen kan de gebruiker zoveel cijfers intikken als deze zelf wil.

Ik heb er een voorbeeld bij, let op: Het voorbeeld is veel verder uitgewerkt, de code hieronder is de basis.
#ID: Test
Pass: test123
PIN: 1234

Voorbeeld();

Voorbeeld: http://futronic.awardspace.com/pin.php

Gesponsorde koppelingen

PHP script bestanden

  1. pin-login

 

Er zijn 28 reacties op 'Pin login'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


19 jaar geleden
 
0 +1 -0 -1
Hoezo krijgt het mannetje in het midden het plaatje niet? Volgens mij onderschept die gewoon alle data, dus ook het plaatje.
Verder natuurlijk de standaart riedel:
Hoezo geen <html>, <head> en <body> ?
Tabellen gebruik je niet voor lay-out / style'en.
Form post controleren met REQUEST_METHOD.
Koen
Koen
19 jaar geleden
 
0 +1 -0 -1
Quote:
Hiervoor heb je echter een certificaat voor nodig en deze kost geld. Als je een goede beveiliging wilt hebben raad ik dit je toch sterk aan!


En dit dan?!
Klaasjan Boven
Klaasjan Boven
19 jaar geleden
 
0 +1 -0 -1
Ik vind het een heel leuk idee..
Hipska BE
Hipska BE
19 jaar geleden
 
0 +1 -0 -1
Ik vind het als gebruiker alvast niet zo leuk!

Nu moet ik 2 wachtwoorden gaan onthouden :(
1x een PIN en 1x gewoon wachtwoord..

NIET gebruiksvriendelijk...

Als je geen geld hebt voor SSL raad ik OpenID aan, en laat het inloggen over aan de grote OpenID providers (denk aan Facebook, Google, Live, ...) http://openid.net/ en https://rpxnow.com/ leesvoer.
Jesper Diovo
Jesper Diovo
19 jaar geleden
 
0 +1 -0 -1
Ik vind het een super leuk idee. Misschien een beetje slecht uitgevoerd, en er zullen altijd nadelen aan zitten, maar die zitten overal aan..
Mar cel
Mar cel
19 jaar geleden
 
0 +1 -0 -1
Ik had net een situatie waarbij ik geen cijfers op de plaatjes zag, bug dus. Na refresh weer wel. Verder goed idee, een wachtwoord veld heeft in dit geval toch eigenlijk geen zin meer? Niet ge-encrypt dus. Wel lastig met de mee kijkers nu. Iedereen die meekijkt weet gelijk je PIN:P
Storeman storeman
storeman storeman
19 jaar geleden
 
0 +1 -0 -1
Ik vind het een leuke vinding, echt praktisch kan ik het echter niet vinden. Het is een heel gedoe dat inloggen op deze manier. Ik had de eerste keer ook niet door dat de cijfers van positie veranderden.

Maar de tussenpersoon kan inderdaad ook het plaatje zien en de posities berekenen. Al met al is er een extra stap voor alle partijen (ook de ongewenste). Eigenlijk zijn er maar twee opties:

1. https
2. Javascript verplichten (afhankelijk van je website kun je de gebruiker deze verplichting wel/niet opleggen), er was ooit iemand hier die hier mee aan het experimenteren was, geen idee waar dat gestrand is.
Www JdeRuijterNL
www JdeRuijterNL
19 jaar geleden
 
0 +1 -0 -1
Waarom nog tabellen voor layout gebruiken anno 2009?


19 jaar geleden
 
0 +1 -0 -1
Heftig script, nice gemaakt en (ik denk) orgineel idee!


19 jaar geleden
 
0 +1 -0 -1
$inlog_id = 'test';
$inlog_pass = 'c548573b139216b4ee06e92bf241a502ee6deaec';
$inlog_pin = 'a310ff9854002c7f6bb60bf9cf6393a890916135';

Kleine bug? Dat moet ie toch niet outputten?
Jurgen assaasas
Jurgen assaasas
19 jaar geleden
 
0 +1 -0 -1
Het idee is leuk, alleen de code ziet er niet erg praktisch uit op het moment. Misschien is het verstandig hier een klasse van te maken zodat hij wat beter bruikbaar is.

En HTTPS is vaak wel betaald. Dit komt doordat je dan een officieel erkend certificaat krijgt. Als je OpenSSL gebruikt zoals de meeste mensen kun je gewoon zelf certificaten per domein aan maken.
Richard van Velzen
Richard van Velzen
19 jaar geleden
 
0 +1 -0 -1
Dit is dus absoluut niet veilig. Als je als man-in-the-middle een beetje bezig bent, kun je de request van Client naar Server onderscheppen (en zorgen dat die dus *niet* door wordt gestuurd) en in plaats daarvan zelf de request afmaken. Oftewel, dan ben je nog steeds ingelogd.
Nicoow Unknown
Nicoow Unknown
19 jaar geleden
 
0 +1 -0 -1
Leuk bedacht, alleen word een dergelijk systeem al heel lang gebruikt in RuneScape dacht ik zo?
Remie
remie
19 jaar geleden
 
0 +1 -0 -1
Quote:
Jurgen schreef op 10.06.2009 10:23
...

En HTTPS is vaak wel betaald. Dit komt doordat je dan een officieel erkend certificaat krijgt. Als je OpenSSL gebruikt zoals de meeste mensen kun je gewoon zelf certificaten per domein aan maken.

Als je OpenSSL gebruikt krijgt de gebruiker in de browser een waarschuwing dat het certificaat niet ondertekend is, wat ook vervelend is voor de gebruikers want en de gebruiker krijgt een onveilig gevoel + extra handelingen om uitzonderingen etc toe te voegen.
Mark L
Mark L
19 jaar geleden
 
0 +1 -0 -1
@ Karl & @Storeman: Ja, volgens mij krijgt de Man-In-The-Middle ook het plaatje. Ik dacht daar gisteravond opeens aan toen ik mijn computer uitgezet had. Eigenlijk zinloos script dus, als deze het plaatje wel krijgt.

@ Hipska: Tja, een password en een PIN intoetsen kost wat extra tijd, take it or leave it.

@ Marcel: Geen bug. Bij het voorbeeld heb ik gemaakt dat je maximaal 10 cijfers in kunt vullen. Heb je meer, dan blokt hij de cijfers, maar laat wel gewoon de achtergrond zien. Je kunt dit zelf instellen.

@ Jey: Het was ook niet de bedoeling om een layout ervan te maken. Ja, ik gebruik bij een layout ook divs, maar de opzet was een PIN en voor testen vond ik het wel even handig om tabellen te gebruiken. Dit ben ik helaas vergeten aan te passen in het geposte script.

@ Danny: Nee, dat klopt, je hebt dan op 'Set' gedrukt. Dit geeft de waarden die in de DataBase gezet moeten worden. Zoals je kunt zien is mijn voorbeeld iets anders dan wat ik gepost heb. Want in mijn post kun je de PIN ook aanpassen, maar dit vond ik niet heel handig om als voorbeeld te gebruiken.

@ Jurgen: Ja, klopt, ik wilde het eigenlijk zo practisch mogelijk neerzetten, maar ik test al mijn scripts op een PHP4 (Zo oud!) server en daar is OOP nog niet goed uitgewerkt.

@ Richard van Velzen: Fout. Hij controleert ook op IP. Je hebt de sessie nodig om in te loggen. De Man-In-The-Middle moet zijn IP dan ook nog gaan veranderen om uberhaupt de sessie af te kunnen maken. En De-Man-In-The-Middle weet ook niet de gegevens, zodat hij ook niet later opnieuw in zou kunnen loggen.

Maar het grootste probleem is waarschijnlijk wel dat de Man-In-The-Middle ook tijdens het versturen van Server -> Cliënt het plaatje en de HTML kan opvangen. Is er een manier om dit tegen te gaan, denken jullie?

Edit:
Voor ik een <input type="image"> gebruikte, gebruikte ik gewoon een <img>. Dan gaf ik 10 hyperlinks dmv <map>. In de hyperlink stond een gehashde string die aan gaf welke plaats je klikte. Maar dit is zeker ook geen optie, want de Man-In-The-Middle kan ook de HTML lezen, zeker? Dan weet hij via een omweg ook welke coördinaten de gebruiker geklikt heeft. En dan kan hij dus in het opgevangen plaatje ook kijken welk getal hierbij hoort.
Steen
steen
19 jaar geleden
 
0 +1 -0 -1
@Hipska: dat is pas lekker veilig, RPX kan gewoon de wachtwoorden onderscheppen.. (ookal ik dat niet legaal)
 
0 +1 -0 -1
Het ziet er echt goed uit vind ik!
Jeroen Spaans
Jeroen Spaans
19 jaar geleden
 
0 +1 -0 -1
Ga dit denk skkr gebruiken bij mijn CRM systeem!
Joren de Wit
Joren de Wit
19 jaar geleden
 
0 +1 -0 -1
Ik ben een voorstander van gebruiksvriendelijkheid van website en in die categorie valt dit script zeker niet.

Allereerst al om eerder genoemde reden van het moeten onthouden van twee 'wachtwoorden'. Maar daarnaast vind ik het nog veel irritanter dat telkens na intoetsen van een cijfer van de pincode de afbeelding vernieuwd wordt en de cijfers weer op een andere plaats zitten.

Leuk bedacht, leuk uitgewerkt, maar geen script dat ik zou gebruiken. Neemt niet weg dat anderen er natuurlijk wel wat van kunnen leren.
Hipska BE
Hipska BE
19 jaar geleden
 
0 +1 -0 -1
@Steen: ik denk dat de ontwikkelaars van RPX (en het hele openID idee) genoeg te vertrouwen zijn om dit zo te laten hoor. Desnoods implementeer je zelf facebook connectie, live connectie, google connectie, openID connectie, hyves connectie, ...
Welke manier zal je het meest tijd besparen denk je?

@Miloan: Niet alleen 2 invullen heb ik het over, maar ook 2 ONTHOUDEN, en daar wringt het schoentje.
Mark L
Mark L
19 jaar geleden
 
0 +1 -0 -1
@ Hipska:

Nouja, mijn mobiel heeft een PIN die ik moet onthouden: Lukt
daarnaast heb ik nog een aantal wachtwoorden die ik moet onthouden voor computer login (Thuis / School): Lukt
En heb ik ook nog een heleboel wachtwoorden van internet te onthouden: Lukt.

En als het niet lukt is er vaak een: 'Wachtwoord vergeten'-functie. Maar deze gebruik je vaak pas als je al weken / maanden ergens niet bent geweest.

2 codes onthouden lukt mij wel - en nee, ik ben niet een of ander briljant persoon, dus ik vermoed dat de meeste mensen ook wel 2 codes kunnen onthouden.

Maar, inderdaad, je hebt meer kans op het vergeten van je inloggegevens als je 2 codes en een gebruikersnaam moet onthouden. Dat klopt.

Ik zeg ook dat SSL ook veiliger en beter is, maar via mijn manier lijkt me het handiger om ook de man achter je tegen te gaan, door een gewoon password te hebben. - Dit is echter een mening.
Richard van Velzen
Richard van Velzen
19 jaar geleden
 
0 +1 -0 -1
Quote:
Fout. Hij controleert ook op IP. Je hebt de sessie nodig om in te loggen. De Man-In-The-Middle moet zijn IP dan ook nog gaan veranderen om uberhaupt de sessie af te kunnen maken. En De-Man-In-The-Middle weet ook niet de gegevens, zodat hij ook niet later opnieuw in zou kunnen loggen.


Enig idee hoe een man-in-the-middle attack echt werkt?? De client heeft *nooit* een verbinding met de server, de man-in-the-middle is een proxy tussen de twee en weet dus precies wat elke partij stuurt. Juist daarvoor is SSL uitgevonden, hoewel zelfs dat op deze manier te onderscheppen is. Het maakt het alleen _veel_ moeilijker, maar dit is echt belachelijk!
Toby hinloopen
toby hinloopen
19 jaar geleden
 
0 +1 -0 -1
Ziet er interessant uit maar zorgt niet echt voor extra beveiliging.
Ik heb zelf ook veel nagedacht aan zulke systemen.

Zolang je geen beveiligde verbinding hebt is het altijd wel te onderscheppen, het maakt het hooguit íetsje moeilijker.

Om daarvoor het gebruikersgemak op deze manier te "verpesten" vind ik zwaar overdreven. + wie heeft er tegenwoordig nou javascript uitgeschakeld? Je kan het ook optioneel maken: Áls er javascript is die beveiliging inschakelen.

Dan nog, wat wil je verzinnen met javascript? Vroeg of laat moet er data van de server naar de client en weer terug. Je kan 1000 omwegen gebruiken maar 0 is 100% secure.

Wel leuk discussie topic... Verzin maar eens een manier om dat zo secure mogelijk te doen, ongeacht hoeveel technieken je ook gebruikt. Daarna kan je je focussen je manier simpeler te maken zonder dat het minder effectief wordt.
Steen
steen
18 jaar geleden
 
0 +1 -0 -1
Wat je beter kunt doen i.p.v. dit is het wachtwoord clientside md5 coderen en zorgen voor een moeilijk wachtwoord.
Mar cel
Mar cel
18 jaar geleden
 
0 +1 -0 -1
Met Javascript zou dat dan moeten? Hier een script: http://pajhome.org.uk/crypt/md5/
Niel Debraune
Niel Debraune
15 jaar geleden
 
0 +1 -0 -1
Pfff ik heb de drie files gemaakt (functions.php, page.php en pin.php) maar als ik naar de site ga waar het zou moeten opstaan dan krijg ik dit te zien : http://www.dobme.net78.net/nl/log
Niel Debraune
Niel Debraune
15 jaar geleden
 
0 +1 -0 -1
Pfff ik heb de drie files gemaakt (functions.php, page.php en pin.php) maar als ik naar de site ga waar het zou moeten opstaan dan krijg ik dit te zien : http://www.dobme.net78.net/nl/log
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Marvin H
Marvin H
15 jaar geleden
 
1 +1 -0 -1
Ten eerste je reageert op een script van 4 jaar oud... en ten tweede, er is geen index.php in je log directory waardoor hij de inhoud weergeeft... Is een server instelling (apache)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. pin-login

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.