Door
Matthijs Vos
op 24-10-2013 18:17
gewijzigd op 25-10-2013 23:10
2.888 views
Hallo allemaal.
Ik ben bezig met een SHA512 hasen in javascript. Nu heb ik daar CryptoJS voor gevonden. Nu hash ik eerst het wachtwoord met een static salt. Deze hash ik vervolgens nog een keer met een dynamic salt. Op de volgde manier:
[code lang=js]
var hash = CryptoJS.HmacSHA512(password,staticsalt);
var editedpw = CryptoJS.HmacSHA512(hash,dynsalt);
[/code]
Echter, nu krijg ik niet de goede hash terug. Ik had als oplossing het volgende gevonden:
[code lang=js]
var editedpw = CryptoJS.HmacSHA512(""+hash+"",salt);
[/code]
maar op de een of andere manier word dan mijn php niet goed meer uitgevoerd, het lijkt wel of de $_POST dan leeg gemaakt word.
Het grappigste van alles is nog dat het er in dat geval helemaal niet toe doet. De >99% clients die JavaScript ondersteunen, verzendt de wachtwoordhash, de rest het wachtwoord zelf. Je kunt dus 100% van de gevallen afdekken.
Maar op het feit na of dit een goede veilige optie is (daar zal denk ik toch elke programmeur een andere visie op hebben, en elke visie zal een voordeel hebben). Weet iemand wat het gene is wat ik fout doe?
Misschien een oplossing als iemand geen javascript aan heeft staan:
Je maakt een aparte afhandeling op de server voor niet ge-encrypte wachtwoorden die daar naartoe worden verzonden omdat javascript uit stond.
Op de pagina van het formulier zet je als action attribuut het adres van deze pagina.
Bij het laden van de pagina laat je het adres in het action attribuut van je form veranderen naar de locatie waar je op de server het wachtwoord wilt ontvangen, als het wel gewoon is ge-encrypt door javascript. Als er geen javascript wordt ondersteund zal dus niet de form action worden veranderd, en zal deze het standaard adres hebben dat je in de broncode in het action attribuut hebt gezet. En dan wordt dus het plain wachtwoord daar naartoe gestuurd en kun je het apart afhandelen.
Als er wel gewoon javascript is ondersteund, wordt dus de action van het formulier veranderd (door js) naar het adres waar het wel gecodeerde wachtwoord naartoe moet worden gestuurd.
Er kan dus in beide gevallen worden ingelogd, js of niet.
Het gaat er alleen om waar je het wachtwoord naartoe stuurt omdat je de goede afhandeling moet doen op de server.
Het is dan wel zo dat als js uit is, dat het wachtwoord alsnog plain wordt verstuurd over internet, maar er kan tenminste worden ingelogd.
Ik kan helaas geen oplossing verzinnen voor als iemand HTML uit heeft staan.. :P
Misschien een oplossing als iemand geen javascript aan heeft staan:
Je maakt een aparte afhandeling op de server voor niet ge-encrypte wachtwoorden die daar naartoe worden verzonden omdat javascript uit stond.
Je kunt een hash vaak herkennen aan de vaste lengte en de gebruikte karakters. Bij SHA512 is dat bijvoorbeeld een hexadecimale waarde (0 t/m f) van 128 karakters:
Dan gaat het wachtwoord dus alsnog plain over de lijn, dat wou ik juist voorkomen. Maak denk ik een systeem die decteert of het uitstaat en dan de gebruiker verzoekt het in te schakelen. Maar wat ik bedoelde met oplossing was eigenlijk de oplossing van het probleem dat ik in de 1e post had staan.