Emil
Inlägg: 2
Blev medlem: 19 sep 2017, 06:30

[Hjälp] Hantering av lösenord

19 sep 2017, 07:29

Hej!

Jag håller på att skapa en hemsida och jag har undersökt vad dom bästa sätten att hantera lösenord är. Jag har kommit fram till en arkitektur men innan jag implementerar den så vill jag veta om folk tycker att den är bra, overkill eller helt enkelt sämst.

Så här ser det ut:

Användaren skriver in ett lösenord -> Användaren klickar på "logga in" -> Lösenordet hashas I webbläsaren (SHA384) -> Förfrågan skickar genom HTTPS (Let's encrypt) -> Paketet har nått servern -> Hasha med bcrypt(sha384(base64($_POST["password"]))) -> password_verify()


Här är varför jag har kommit fram till det:

Jag vill inte ha möjligheten att se vad användaren har för lösenord, jag kan snappa upp vad det är genom POST datan efter dom har skickat inloggnings-förfrågan. Om jag kan se det så kan en attackerare också se det om han skulle lyckas få server tillgång. Om jag inte hashar via webbläsaren så kan han helt enkelt spara lösenorden som skickas via POST och sen hämta ut dem dem istället för bcrypt hasharna som finns i databasen. I det här fallet kan han i bästa fall bara få ut sha384 hashar från dom som loggar in under tiden han har tillgång till servern.

Sen när vi äntligen ska validera lösenordet vill jag hasha det igen. Då börjar vi med base64 eftersom om vi enbart använder bcrypt(sha384($password)) så kan det finnas en chans att det finns "0x00" i sha384 hashet och då kan bcrypt se det som en nullbyte. Sen vill jag använda sha384 igen för jag litar inte på användaren, han kan lika väl skita i att hasha lösenordet och sen vill jag slutligen använda Bcrypt som är standard inom lösenord hashning.




Jag ber om ursäkt om det är rörigt att läsa, det är rätt tidigt. :)

Användarvisningsbild
deletedX
Respekterad Medlem
Inlägg: 131
Blev medlem: 17 okt 2014, 11:55

Re: [Hjälp] Hantering av lösenord

19 sep 2017, 17:37

Hej!

Jag håller på att skapa en hemsida och jag har undersökt vad dom bästa sätten att hantera lösenord är. Jag har kommit fram till en arkitektur men innan jag implementerar den så vill jag veta om folk tycker att den är bra, overkill eller helt enkelt sämst.

Så här ser det ut:

Användaren skriver in ett lösenord -> Användaren klickar på "logga in" -> Lösenordet hashas I webbläsaren (SHA384) -> Förfrågan skickar genom HTTPS (Let's encrypt) -> Paketet har nått servern -> Hasha med bcrypt(sha384(base64($_POST["password"]))) -> password_verify()


Här är varför jag har kommit fram till det:

Jag vill inte ha möjligheten att se vad användaren har för lösenord, jag kan snappa upp vad det är genom POST datan efter dom har skickat inloggnings-förfrågan. Om jag kan se det så kan en attackerare också se det om han skulle lyckas få server tillgång. Om jag inte hashar via webbläsaren så kan han helt enkelt spara lösenorden som skickas via POST och sen hämta ut dem dem istället för bcrypt hasharna som finns i databasen. I det här fallet kan han i bästa fall bara få ut sha384 hashar från dom som loggar in under tiden han har tillgång till servern.

Sen när vi äntligen ska validera lösenordet vill jag hasha det igen. Då börjar vi med base64 eftersom om vi enbart använder bcrypt(sha384($password)) så kan det finnas en chans att det finns "0x00" i sha384 hashet och då kan bcrypt se det som en nullbyte. Sen vill jag använda sha384 igen för jag litar inte på användaren, han kan lika väl skita i att hasha lösenordet och sen vill jag slutligen använda Bcrypt som är standard inom lösenord hashning.




Jag ber om ursäkt om det är rörigt att läsa, det är rätt tidigt. :)
Bra och overkill. Personligen hade jag skippat base64 samt SHA384-hashningen på klientsidan och lagt in någon form av kontroll att inloggningssidan inte manipuleras. Om du är rädd för en angripare som kan manipulera källkod till att läsa av inloggningsparametrar bör du också oroa dig för en angripare som lägger en separat funktion vid inloggningssidan som inte hashar lösenordet och skickar det vidare till din ägda server eller angriparen själv. Eller du menar kanske att användaren manuellt ska hasha med sha384?

Emil
Inlägg: 2
Blev medlem: 19 sep 2017, 06:30

Re: [Hjälp] Hantering av lösenord

19 sep 2017, 19:49

Jag kom på lite senare att om attackeraren har tillgång till servern så kan han ju helt enkelt radera/modifiera antingen Javascripten eller PHP koden som används för att hasha lösenordet, som du nämnde precis.

Det skulle kanske gå att göra så att www-användaren inte har en möjlighet att radera eller modifiera filer I htdocs-mappen. Eller kanske gå lite overkill och göra ett program som har ett register med legitima filer som byter ut dom I htdocs om md5sum av filerna inte matchar (Sen ha korrekta rättigheter så det programmet inte kan modifieras/bytas ut/stängas av eller raderas av vanliga användare). Tror du att det skulle vara värt att implementera client side hashing då? Iofs kan jag se lösenorden då jag har root på servern, men det har ju inte en attackerare förutom om dom har en metod för att göra så på mitt server OS.

Ang processen så menar jag att lösenordet hashas automatiskt med sha384 med Javascript innan den skickar förfrågan för att logga in. Sen fortsätter jag att skydda lösenordet I backend genom att använda bcrypt(base64_encode(sha384($_POST["password"]))) och efter detta kan vi jämföra hasharna I databasen.

Anledningen till varför jag använder base64 är för att det kan finnas en chans att sha384() hashet innehåller ett 0x00 som bcrypt ser som nullbyte, då kommer den att avsluta hashningen när den ser det tecknet. Anledningen till varför jag använder sha384() är så att vi slipper teckengränsen som bcrypt har.

Användarvisningsbild
avlidienbrunn
Respekterad Medlem
Inlägg: 131
Blev medlem: 08 mar 2015, 15:32
Områden: a'">http://a.b/<u>sd

Re: [Hjälp] Hantering av lösenord

21 sep 2017, 11:37

Men om klienten kör sha384 så varför göra det igen på serversidan?

Användarvisningsbild
sebastian
Inlägg: 139
Blev medlem: 29 apr 2016, 10:05
Områden: proxy,antivirus
Kontakt: Twitter

Re: [Hjälp] Hantering av lösenord

23 sep 2017, 20:33

Men om klienten kör sha384 så varför göra det igen på serversidan?
Nu vet jag inte om du menar om han inte ska hasha över huvud taget på serversidan, eller om du menar att man kan skippa sha384 men ha kvar bcrypt.
Men självklart ska man hasha på serversidan, annars blir ju hashen tekniskt sett lösenordet.

Men sedan tycker jag det räcker med bcrypt. Du behöver altså INTE sha384 först på serversidan. Sedan är det faktiskt bättre att använda sha384_hex istället för sha384 på klientsidan, då slipper du problemet med nullbytes och du får alltid en konstant längd på "lösenordet" vilket gör att du kan lägga in en check för detta, dessutom används enbart tecknen 0-9 och a-f, varför du ytterligare kan lägga in en check för detta. Då skyddar du också mot eventuella buffer overflow och andra säkerhetshål som potentiellt skulle kunna finnas i bcrypt-funktionen. Då behöver du inte heller base64.

Dvs sha384_hex på klientsidan, kapa till 72 tecken innan du skickar.
sedan bcrypt på (password) på serversidan, efter att ha filtrerat bort allt som inte är 0-9 och a-f, samt kontrollerat så längden är exakt 72 tecken.

Dock är detta grovt overkill om din hemsida bara är en gästbok eller något där man bara kommenterar och det bara är ett "skitkonto".
En helt annan sak om det är en webbshopp där man kan beställa och det finns känsliga uppgifter o sådant.

Användarvisningsbild
deletedX
Respekterad Medlem
Inlägg: 131
Blev medlem: 17 okt 2014, 11:55

Re: [Hjälp] Hantering av lösenord

24 sep 2017, 09:34

Nu vet jag inte om du menar om han inte ska hasha över huvud taget på serversidan, eller om du menar att man kan skippa sha384 men ha kvar bcrypt.
Men självklart ska man hasha på serversidan, annars blir ju hashen tekniskt sett lösenordet.
Jag tror vad som åsyftades var att det är ganska poänglöst att hasha med SHA384 på både klient- och serversidan.
kapa till 72 tecken innan du skickar.
Varför göra så?

Användarvisningsbild
sebastian
Inlägg: 139
Blev medlem: 29 apr 2016, 10:05
Områden: proxy,antivirus
Kontakt: Twitter

Re: [Hjälp] Hantering av lösenord

02 okt 2017, 16:41

Varför göra så?
För att bcrypt tar inte mera.
https://security.stackexchange.com/ques ... ord-length

Användarvisningsbild
deletedX
Respekterad Medlem
Inlägg: 131
Blev medlem: 17 okt 2014, 11:55

Re: [Hjälp] Hantering av lösenord

07 okt 2017, 19:23

Det där borde jag ha läst mig till. Jaja, tack för förklaringen.