Intens thuis in beveiliging ben ik niet, maar wel redelijk in ieder geval. Vandaar dat ik wat vragen heb over een systeem wat we, op mijn werk, willen gebruiken om mensen van de ene geautoriseerde omgeving door te leiden naar een andere binnen een ander serverpark.
Het idee werkt zo:
1. Men logt in op een website
2. Onze clientsoftware genereert een link waarop men kan klikken en men op onze site komt. De link is onbeperkt geldig en kan worden doorgegeven (kun je zelf niks meer kopen alleen). Deze laatste twee zijn by-design omdat we hier geen problemen mee verwachten
3. Onze software controleert de link, voert hashes opnieuw uit en vergelijkt de resultaten: klopt het? Mooi! Anders jammer maar helaas.
De links werken als volgt.
1. Men krijgt van ons een shopnaam (identifying in ons systeem)
2. Men krijgt van ons een geheime sleutel (48 bits)
3. Ieder lid heeft, op de organisatiesite, een uniek nummer
Vervolgens creëert onze software een random stringhash, concate dit met de shopnaam, sleutel en nummer en hasht dit weer met SHA-512. Deze hash wordt, samen met de random stringhash, shopnaam en nummer via de GET-parameters naar onze server gestuurd. Onze server heeft dezelfde geheime sleutel voor de betreffende shop. De server neemt dezelfde hash (alle gegevens zijn bekend) en vergelijkt deze met de gestuurde. Indien ze gelijk zijn is het goed en kan het betreffende lidnummer verder gaan, anders volgt een foutmelding.
Mijn vragen:
1. Is dit inderdaad zo veilig als ik denk? (ik denk dat het voldoet gezien de shared key niet te achterhalen is dus de hash de rest van de data kan garanderen)
2. Zijn er dingen die ik vergeet?
3. Wat zijn in dit geval de nadelen voor een replay-attack omdat de link onbeperkt geldig is en doorgegeven kan worden? Men verliest dan simpelweg zelf het recht op het kopen van iets, maar dat was ook al met doorgeven. Zie ik iets over het hoofd?
De code, zoals die in beta is, staat natuurlijk OS op GitHub op https://github.com/in-ventID/externalShopAuthentication. Ik heb de PHP versie geschreven en vervolgens geport naar Java; beide versies zijn in principe hetzelfde en zouden dezelfde gaten moeten hebben
P.S. Ik bedenk me net dat ik simpelweg een timestamp mee kan sturen (en hashen) met daarin de generatietijd en deze vervolgens -10 tot +10 min geldig kan laten zijn (tijdsissues tussen servermarge)
Het idee werkt zo:
1. Men logt in op een website
2. Onze clientsoftware genereert een link waarop men kan klikken en men op onze site komt. De link is onbeperkt geldig en kan worden doorgegeven (kun je zelf niks meer kopen alleen). Deze laatste twee zijn by-design omdat we hier geen problemen mee verwachten
3. Onze software controleert de link, voert hashes opnieuw uit en vergelijkt de resultaten: klopt het? Mooi! Anders jammer maar helaas.
De links werken als volgt.
1. Men krijgt van ons een shopnaam (identifying in ons systeem)
2. Men krijgt van ons een geheime sleutel (48 bits)
3. Ieder lid heeft, op de organisatiesite, een uniek nummer
Vervolgens creëert onze software een random stringhash, concate dit met de shopnaam, sleutel en nummer en hasht dit weer met SHA-512. Deze hash wordt, samen met de random stringhash, shopnaam en nummer via de GET-parameters naar onze server gestuurd. Onze server heeft dezelfde geheime sleutel voor de betreffende shop. De server neemt dezelfde hash (alle gegevens zijn bekend) en vergelijkt deze met de gestuurde. Indien ze gelijk zijn is het goed en kan het betreffende lidnummer verder gaan, anders volgt een foutmelding.
Mijn vragen:
1. Is dit inderdaad zo veilig als ik denk? (ik denk dat het voldoet gezien de shared key niet te achterhalen is dus de hash de rest van de data kan garanderen)
2. Zijn er dingen die ik vergeet?
3. Wat zijn in dit geval de nadelen voor een replay-attack omdat de link onbeperkt geldig is en doorgegeven kan worden? Men verliest dan simpelweg zelf het recht op het kopen van iets, maar dat was ook al met doorgeven. Zie ik iets over het hoofd?
De code, zoals die in beta is, staat natuurlijk OS op GitHub op https://github.com/in-ventID/externalShopAuthentication. Ik heb de PHP versie geschreven en vervolgens geport naar Java; beide versies zijn in principe hetzelfde en zouden dezelfde gaten moeten hebben
P.S. Ik bedenk me net dat ik simpelweg een timestamp mee kan sturen (en hashen) met daarin de generatietijd en deze vervolgens -10 tot +10 min geldig kan laten zijn (tijdsissues tussen servermarge)