Lösenordshash och säkerhet, på riktigt - Lite frågor [PHP]

Permalänk
Medlem

Lösenordshash och säkerhet, på riktigt - Lite frågor [PHP]

Tjena!

Tänkte att jag skulle lära mig koda riktigt säkra PHP-applikationer. Och då är det ju bra att lära sig det här med att lagra lösenord säkert. Visst kan man använda färdiga frameworks som är skitbra, vilket jag gjort förut, men grejen är ju den att jag vill lära mig det.

Efter att ha läst lite diverse guider och kommentarer har jag åstadkommit detta:

<?php define('SALT_LENGTH', 15); function LetsHash($phrase, &$salt = null) { $key = '!"#¤%&/()=?_:+[]{}?-\;><.@£€´`'; if ($salt == '') { $salt = substr(hash('sha512', uniqid(rand(), true).$key.microtime()), 0, SALT_LENGTH); } else { $salt = substr($salt, 0, SALT_LENGTH); } return hash('sha512', hash('sha512', $salt . $key . $phrase)); } ?>

Ser ni några större brister? Eller förbättringar?
Ang. dubbelhashningen så läste jag att det ska minska riskerna för en hash-kollition hitta en hash-kollition med denna metod, så länge man använder samma hash-metod. Har jag fattat rätt? Och, isf, hur många ggr bör man hasha?

sha512, är väl säkrare än sha256?

Nästa steg blir till att göra ett riktigt säker auth-script.
Tack på förhand! //Johannes

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem

Tja jag rekommenderar att du kollar in Bcrypt

http://stackoverflow.com/questions/4795385/how-do-you-use-bcr...

Varför har du lite svar här på:
http://yorickpeterse.com/articles/use-bcrypt-fool/

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Medlem

Whirlpool är den säkraste hash-lösningen vad jag vet, och den har inte ens blivit crackad än, jämört med MD5 och SHA. Whirlpool är en 128 tecken lång sträng. MD5 och SHA är dock säker (dock inte helt säkert, jämfört med Whirlpool) om man använder sig av en slumpmässig saltning både före och efter själva hash-strängen. Man behöver ingen saltning till Whirlpool, på grund av den starka säkerheten i det.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem
Skrivet av MugiMugi:

Det här var ju intressant. Efter att ha läst på en del blir det mesta mycket klarare. Förstod dock inte jätte mycket utav koden som var postad där, men det ska jag väl göra snart.
Om jag fattat rätt så är det finurliga med bcrypt att den är långsam, så långsam man vill att den ska vara, samt att den kräver salt vilket gör att den är skyddad mot både bruteforce/dictonary-attacker och rainbow-tables-attacker?

Skrivet av Airikr:

Whirlpool är den säkraste hash-lösningen vad jag vet, och den har inte ens blivit crackad än, jämört med MD5 och SHA. Whirlpool är en 128 tecken lång sträng. MD5 och SHA är dock säker (dock inte helt säkert, jämfört med Whirlpool) om man använder sig av en slumpmässig saltning både före och efter själva hash-strängen. Man behöver ingen saltning till Whirlpool, på grund av den starka säkerheten i det.

Okej, men jag kollar nog in bcrypt. Men, hur kan en hashlösning vara skyddad mot rainbow-tables utan salt?

EDIT: Oj, sry. Nu blev det dubbelpost. Det var ju inte meningen. Värst vad jag klickar fel idag.

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem

Huvudsaken är att du använder en hash som är gjord just för att lagra lösenord (dvs. långsam, inbyggt salt) som till exempel bcrypt eller scrypt. Tanken är att något som tar lång tid att beräkna tar längre tid att bruteforcea (med till exempel en dictionary-attack).

Normala kryptografiska hashar som SHA, MD5 m.fl. är designade för att vara hyfsat snabba, eftersom de är tänkta att verifiera integriteten hos data, inte för att lagra eller jämföra lösenord.

Mer utförliga svar finns på crypto.SE och security.SE.

Permalänk
Medlem

Vad tror ni om detta då? Eller har jag fattat helt fel med saltet? Och så kan jag tyvärr inte testa't för tillfället då mitt webhotell saknar stöd för blowfish och inte heller kör PHP 5.3. *installerar wamp*

function LetsHash($phrase, $rounds = 12) { if (CRYPT_BLOWFISH != 1) { throw new Exception('Stöd för BCrypt saknas. Se http://php.net/crypt för mer info.'); return; } $key = '!"#¤%&/()=?_:+[]{}?-\;><.@£€´`'; $salt = substr(hash('sha512', uniqid(rand(), true).$key.microtime()), 0, 22); $salt_prefix = sprintf('$2a$%02d$', $rounds); return crypt($phrase, $salt_prefix . $salt); }

EDIT:
Bör man slänga in något sånt här också? Kan det hjälpa något, eller räcker det med saltet?

$phrase = str_replace($phrase, $arr1, $arr2);

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem
Skrivet av Xburk:

Okej, men jag kollar nog in bcrypt. Men, hur kan en hashlösning vara skyddad mot rainbow-tables utan salt?

Det där är dock en fråga som jag tyvärr inte kan svara på, då jag enbart vet att Whirlpool är en väldigt bra hash-metod.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem
Skrivet av Xburk:

Vad tror ni om detta då? Eller har jag fattat helt fel med saltet? Och så kan jag tyvärr inte testa't för tillfället då mitt webhotell saknar stöd för blowfish och inte heller kör PHP 5.3. *installerar wamp*

function LetsHash($phrase, $rounds = 12) { if (CRYPT_BLOWFISH != 1) { throw new Exception('Stöd för BCrypt saknas. Se http://php.net/crypt för mer info.'); return; } $key = '!"#¤%&/()=?_:+[]{}?-\;><.@£€´`'; $salt = substr(hash('sha512', uniqid(rand(), true).$key.microtime()), 0, 22); $salt_prefix = sprintf('$2a$%02d$', $rounds); return crypt($phrase, $salt_prefix . $salt); }

Din "salt"-sträng ska se ut så här:

Citat:

Blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 digits from the alphabet "./0-9A-Za-z". Using characters outside of this range in the salt will cause crypt() to return a zero-length string. The two digit cost parameter is the base-2 logarithm of the iteration count for the underlying Blowfish-based hashing algorithmeter and must be in range 04-31, values outside this range will cause crypt() to fail.

Skrivet av Xburk:

EDIT:
Bör man slänga in något sånt här också? Kan det hjälpa något, eller räcker det med saltet?

$phrase = str_replace($phrase, $arr1, $arr2);

Helt meningslöst. Det tillför ingenting.

Skrivet av Airikr:

Det där är dock en fråga som jag tyvärr inte kan svara på, då jag enbart vet att Whirlpool är en väldigt bra hash-metod.

Whirlpool är en bra kryptografisk hash. Den är alldeles för snabb för att användas i det syfte TS vill. Den kommer inte stå emot rainbow-tables utan salt, och även med salt är det relativt lätt (det vill säga beräkningsmässigt möjligt inom en rimlig tid) att utföra en dictionary-attack om man har både hash och salt (vilket man måste förutsätta är fallet).

Permalänk
Medlem
Skrivet av You:

Din "salt"-sträng ska se ut så här:

Jo, men saltet blir ju 22 tecken långt med tecken från "./0-9A-Za-z" (iofs inte ./, men resten). Det jag undrar är ifall min metod är ineffektiv/dålig.

Skrivet av You:

Helt meningslöst. Det tillför ingenting.

Okej, men försvårar det inte för en dictonary attack, ifall den som ska knäcka lösenordet redan har saltet? Fast det kanske inte spelar någon roll så länge han eller hon inte har min salt-sträng, och isf har ju denna/denne str_replace-strängen.

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Musikälskare

Grymt intressant tråd, kan tyvärr inte svara på dina frågor

Visa signatur

❀ Monitor: ASUS Swift 27" @ 1440p/165Hz ❀ CPU: Ryzen 7700X ❀ Cooling: Corsair H170i ELITE 420mm ❀ GPU: MSI 3080 Ti SUPRIM X ❀ Memory: Corsair 32GB DDR5 Vengeance ❀ Motherboard: ASUS Crosshair X670E Hero ❀ M.2: Samsung 980 Pro ❀ PSU: Corsair HX1200 ❀ Chassi: Corsair 7000X ❀ Time Spy: 19 340

📷 Mina fotografier
🎧 Vad lyssnar du på just nu?

Permalänk
Medlem
Skrivet av Xburk:

Jo, men saltet blir ju 22 tecken långt med tecken från "./0-9A-Za-z" (iofs inte ./, men resten). Det jag undrar är ifall min metod är ineffektiv/dålig.

Missade SHA-biten och tänkte att du hade $key i ditt salt, men så var ju inte fallet. Din metod är väl som vilken annan som helst, antar jag.

Skrivet av Xburk:

Okej, men försvårar det inte för en dictonary attack, ifall den som ska knäcka lösenordet redan har saltet? Fast det kanske inte spelar någon roll så länge han eller hon inte har min salt-sträng, och isf har ju denna/denne str_replace-strängen.

Möjligtvis lite. Men det försvårar inte för en bruteforce-attack, och de är inte nämnvärt svårare än dictionay-attacker (för en mindre summa pengar kan du testa runt 700 miljoner lösenord per sekund, eller alla lösenord på 8 tecken på ett par minuter).

Permalänk
Medlem
Skrivet av You:

Missade SHA-biten och tänkte att du hade $key i ditt salt, men så var ju inte fallet. Din metod är väl som vilken annan som helst, antar jag.

Möjligtvis lite. Men det försvårar inte för en bruteforce-attack, och de är inte nämnvärt svårare än dictionay-attacker (för en mindre summa pengar kan du testa runt 700 miljoner lösenord per sekund, eller alla lösenord på 8 tecken på ett par minuter).

Okej, tack så mycket för hjälpen.

Undrar ifall nån har en bra idé för att slänga in "/." i saltet också. För det lär väl inte vara särskilt fördelaktigt att utesluta två tecken från det?

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem

Kom på en till grej.

Hur kan man försvåra att lösenordet kommer på vift när klienten skickar det? För där är det ju som farligast, i klartext, hos klienten. Förutom att se till att användarna fattar att man inte ska ha lösenordet på en lapp bredvid datorn, och allt sånt, hur kan man se till att det inte blir sniffat? Är det HTTPS som gäller? Och, är det någon idé att ge sig in på det? Eller ja, det är det ju i så fall, om vi ska snäcka säkerhet "på riktigt".

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem
Skrivet av Xburk:

Kom på en till grej.

Hur kan man försvåra att lösenordet kommer på vift när klienten skickar det? För där är det ju som farligast, i klartext, hos klienten. Förutom att se till att användarna fattar att man inte ska ha lösenordet på en lapp bredvid datorn, och allt sånt, hur kan man se till att det inte blir sniffat? Är det HTTPS som gäller? Och, är det någon idé att ge sig in på det? Eller ja, det är det ju i så fall, om vi ska snäcka säkerhet "på riktigt".

Det är HTTPS (med SSL eller TLS) som gäller, alternativt det mindre säkra HTTP Digest authentication.