De andere antwoorden zeggen al Nee, "rol je eigen" is zelden een goed wachtwoordopslagschema en die van jou is geen uitzondering.
Ik zou graag willen toevoegen: is ook geen goed schema voor het opslaan / communiceren van de gebruikersnaam.
Je bent eigenlijk aan het hashen. Daar is niets mis mee, behalve:
- Je gebruikt een functie die niet ontworpen is als een veilige hashfunctie. Omdat het een cijfer is, is het zeker aan het "veilige" einde van de schaal, maar hashing houdt ook in dat hash-botsingen worden vermeden. Een cijfer is doorgaans niet geoptimaliseerd om geen botsing te hebben. One-Time Pads staan erom bekend dat ze onbreekbaar zijn, omdat ze het maximale aantal botsingen hebben. Dus een sterk cijfer maakt een slechte hash in termen van botsingen.
- Als je gebruikersnaam en gebruikersnaam-versleuteld-met-wachtwoord opslaat, zijn er meer kwetsbaarheden:
- In dit geval, als je database wordt gehackt, krijgt de aanvaller niet alleen
de gebruikersnaam versleuteld met een onbekend wachtwoord
. Hij krijgt ook de duidelijke tekst aka. gebruikersnaam. Het is dus een duidelijke tekstanalyse, die voor sommige cijfers veel gemakkelijker is dan brute kracht. - Hash-botsingen: de aanvaller hoeft het wachtwoord niet te weten, maar alle die dezelfde codering produceert voor een korte en duidelijke tekst. Dit is misschien zelfs eenvoudiger dan analyse in zuivere tekst.
- Als u de gebruikersnaam niet opslaat maar vertrouwt op één gecombineerde verzonden waarde, zijn er nog steeds nadelen:
- In dit geval heb je waarschijnlijk geen rekening gehouden met hash-botsingen. Hoe zit het met twee gebruikers die dezelfde gebruikersnaam hebben? Hoe zit het met twee idioten, die dezelfde gebruikersnaam en hetzelfde wachtwoord hebben? Hoe zit het met hash-botsingen van verschillende gebruikersnamen en wachtwoorden door puur toeval (onthoud: cijfers zijn niet geoptimaliseerd om botsingen te voorkomen!)?
- In elk geval is er de "Pass the hash" -aanval: een aanvaller die netwerkcommunicatie snuffelt, kan eenvoudig uw applicatie emuleren om dezelfde gegevens door te geven als de gebruiker. Heb je daar iets aan gedaan? Als dat niet het geval is, moet u daarom niet "uw eigen rol spelen".
Vaak is het overdrachtsprotocol net zo belangrijk voor de beveiliging als een sterke cryptografische functie, onafhankelijk van hashing of versleuteling. Een slecht protocol kan uw functie blootstellen aan aanvallen waarvoor het niet geschikt is, met name "side channel-aanvallen" zoals "pass the hash" of "man in the middle" die de daadwerkelijke crypto-analyse aan de kant van de aanvaller omzeilen.
Uw wachtwoordopslagschema kan vatbaar zijn voor dergelijke aanvallen, omdat u niet hebt aangegeven of de gebruikersnaam ook in gewone tekst wordt opgeslagen. Hierdoor wordt uw plan blootgesteld aan de hierboven beschreven aanvallen. Als u het niet in gewone tekst opslaat, kan een overdrachtsprotocol nodig zijn dat vatbaar is voor aanvallen, zoals hierboven beschreven.
Hier zijn enkele aanvullende gedachten over overdrachtsprotocollen in uw geval, enigszins algemeen:
Als u dat niet deed doe niets aan de "pass the hash" -aanval, dan is je plan erger dan die van heel veel andere. Een aanvaller hoeft uw database niet te hacken of uw cijfer te kraken. Hij krijgt gratis wat hij nodig heeft door netwerkverkeer te snuiven.
HTTPS kan volstaan, hoewel het kan worden omzeild door "man in the middle": gebruikers controleren niet op authenticatiecertificaten, toch? Een aanvaller opent eenvoudig een niet-geverifieerde maar gecodeerde verbinding met uw gebruiker en wat er ook maar naar u wordt verwacht.
Een extra Challenge-Response-schema kan de beveiliging toevoegen. Voorafgaand aan het inloggen ontvangt de client een eenmalige willekeurige string (challenge) die hij in de hash (response) moet inbouwen. Een aanvaller kan een gesnoven hash niet opnieuw gebruiken, omdat de uitdaging ook niet opnieuw wordt gebruikt.
Maar nogmaals, het is niet nodig om je eigen hash te rollen.