Ik ben bezig met het maken van een - hopelijk veilig - login systeem dat gebruik maakt van challenge / response. Ik doe dit met PHP en Javascript. Ik heb nog nooit eerder gewerkt met challenge / response technieken dus vergeef me als ik domme dingen zeg.
Wat ik eerst doe is een random string van 50 characters genereren die dient als de challenge. Deze challenge staat in het inlogformulier in een hidden field. Dit is bijvoorbeeld: lvylgM87Un2f68bTyiQc8eifexJObjmkerT6xftjM5zp0x0dZv.
De challenge is opgeslagen in een database en is gekoppeld aan het session_id van de gebruiker. Verder is de challenge voor 5 minuten geldig, daarna komt hij te vervallen.
Als de gebruiker zijn of haar gebruikersnaam en wachtwoord heeft ingevoerd en op submit klikt wordt er een Javascript functie aangeroepen. Deze functie maakt de response voor de server. De functie ziet er als volgt uit:
De respons voor de server is dus in de vorm: sha1(username:sha1(password):challenge), bijvoorbeeld: monnick:42e3d96910f922bdd7dd1805fe3f8aff634f391d:lvylgM87Un2f68bTyiQc8eifexJObjmkerT6xftj... maar dan met sha1 gehashed.
Nu zou ik nog graag een salt implementeren, ik weet alleen niet goed hoe ik dit veilig kan doen. Als ik de Javascript functie het wachtwoord met de salt wil laten hashen, dan moet de salt dus ook opgeslagen worden in bijvoorbeeld een hidden field. Alleen in dit geval is de salt dus openbaar, en dat lijkt me niet echt veilig. Misschien dat Ajax hier nog wat voor me kan doen.
Hebben jullie ideeën, zie ik iets over het hoofd of is het gewoon een domme vraag?
Als jullie commentaar hebben op de bovenstaande challenge / response methode hoor ik dat ook graag. Ik hoop het echt een beetje veilig te maken namelijk
Wat ik eerst doe is een random string van 50 characters genereren die dient als de challenge. Deze challenge staat in het inlogformulier in een hidden field. Dit is bijvoorbeeld: lvylgM87Un2f68bTyiQc8eifexJObjmkerT6xftjM5zp0x0dZv.
De challenge is opgeslagen in een database en is gekoppeld aan het session_id van de gebruiker. Verder is de challenge voor 5 minuten geldig, daarna komt hij te vervallen.
Als de gebruiker zijn of haar gebruikersnaam en wachtwoord heeft ingevoerd en op submit klikt wordt er een Javascript functie aangeroepen. Deze functie maakt de response voor de server. De functie ziet er als volgt uit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
| function doChallengeResponse() { var username = document.getElementById('username').value; var password = sha1(document.getElementById('password').value); var challenge = document.getElementById('challenge').value; // Empty the password field to prevent it from being send document.getElementById('password').value = ''; document.getElementById('challenge').value = ''; // Create the response string document.getElementById('response').value = sha1(username + ':' + password + ':' + challenge); } |
De respons voor de server is dus in de vorm: sha1(username:sha1(password):challenge), bijvoorbeeld: monnick:42e3d96910f922bdd7dd1805fe3f8aff634f391d:lvylgM87Un2f68bTyiQc8eifexJObjmkerT6xftj... maar dan met sha1 gehashed.
Nu zou ik nog graag een salt implementeren, ik weet alleen niet goed hoe ik dit veilig kan doen. Als ik de Javascript functie het wachtwoord met de salt wil laten hashen, dan moet de salt dus ook opgeslagen worden in bijvoorbeeld een hidden field. Alleen in dit geval is de salt dus openbaar, en dat lijkt me niet echt veilig. Misschien dat Ajax hier nog wat voor me kan doen.
Hebben jullie ideeën, zie ik iets over het hoofd of is het gewoon een domme vraag?
Als jullie commentaar hebben op de bovenstaande challenge / response methode hoor ik dat ook graag. Ik hoop het echt een beetje veilig te maken namelijk