Beveiliging loginsysteem
Mijn website is de afgelopen twee weken al 3x gehackt.
Mijn vorige login was beveiligd tegen sql injection
door middel van de php functie mysql_real_escape_string.
Mijn wachtwoorden werden geëncrypt door middel van md5 en sha1.
Alsnog is het de hacker gelukt in te breken op mijn account.
Ik heb mijn beveiliging versterkt door de wachtwoorden te salten,
maar ik wil toch graag even zeker zijn dat dit veilig is.
Heeft iemand nog tips voor me hoe ik mijn login nog veiliger kan maken
en hoe ik eventuele session/cookie hijacking beter tegen kan gaan?
Bij voorbaat dank!
Groetjes,
Mik
Toevoeging:
alleen het userid van de gebruiker en een random aangemaakte
key word in de sessie en cookie opgeslagen. De key zorgt ervoor
dat als iemand anders inlogt op je account je uitgelogd word met de
melding: Je bent ingelogt op een andere computer.
Het rare is dat toen de hacker inlogte op mijn account ik zelf ingelogd was
echter werd ik niet uitgelogd, dus moet het wel een session/cookie hijacking
geweest zijn.
Gewijzigd op 02/02/2011 20:15:59 door Mik PHP
xss).
Verder moet je altijd een salt gebruiken bij passwords. Passwords en gebruikersnamen en de hashes ervan sla je nergens op, gebruik je alleen bij het inloggen om te vergelijken.
Sowieso is het handig als je probeert uit te vinden hoe die hack plaats heeft kunnen vinden (bijvoorbeeld door Verder moet je altijd een salt gebruiken bij passwords. Passwords en gebruikersnamen en de hashes ervan sla je nergens op, gebruik je alleen bij het inloggen om te vergelijken.
Nog even benadrukken wat Karl zegt en wat heel belangrijk is: Passwords en gebruikersnamen en de hashes ervan sla je nergens op, vooral niet in cookies of sessies.
Oke top, ik zal het even gaan uitzoeken. Maar je zegt op het laatst dat je de hashes van je gebruikersnaam of wachtwoord nergens mag opslaan.. maar hoe kan ik ze dan vergelijken? Of bedoel je daarmee niet in sessies of cookies? Want ik sla ze dus gesalt op in mijn database
Ja, alleen gesalt in db mag.
Toevoeging op 02/02/2011 20:28:22:
Deze salt heb ik trouwens gevonden hier op phphulp
Maar is het handiger om het eerst te salte en dan eventueel nog md5 en/of sha1 eraan toe te voegen, of eerst md5/sha1 en daarna de salt.
Is dit script ook veilig en moet ik zelf nog het een en ander veranderen?
Ben nog niet zo bekend met salten namelijk
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
function salt($pass, $salt="ag7dy23kl6yw4bd9x0k3", $str="")
{
$pass = str_replace(" ", "", $pass);
$pass = strrev($pass);
$arr[0] = strlen($pass);
$arr[1] = strlen($salt);
while($arr[0] > $arr[1] + 1)
{
$salt = $salt.$salt;
$arr[1] = strlen($salt);
}
$split_len = floor(max($arr) / (min($arr) - 1));
$salt = explode(" ", chunk_split($salt, $split_len, " "));
array_pop($salt);
$salt = array_reverse($salt);
$j = $arr[0] > count($salt) ? $arr[0] : count($salt);
for($i=0; $i<$j; $i++)
{
if(isset($pass{$i})) $str .= $pass{$i};
if(isset($salt[$i])) $str .= $salt[$i];
}
return $str;
}
?>
function salt($pass, $salt="ag7dy23kl6yw4bd9x0k3", $str="")
{
$pass = str_replace(" ", "", $pass);
$pass = strrev($pass);
$arr[0] = strlen($pass);
$arr[1] = strlen($salt);
while($arr[0] > $arr[1] + 1)
{
$salt = $salt.$salt;
$arr[1] = strlen($salt);
}
$split_len = floor(max($arr) / (min($arr) - 1));
$salt = explode(" ", chunk_split($salt, $split_len, " "));
array_pop($salt);
$salt = array_reverse($salt);
$j = $arr[0] > count($salt) ? $arr[0] : count($salt);
for($i=0; $i<$j; $i++)
{
if(isset($pass{$i})) $str .= $pass{$i};
if(isset($salt[$i])) $str .= $salt[$i];
}
return $str;
}
?>
Onzin wat je hierboven post, is allemaal te veel werk :-)
Gewijzigd op 02/02/2011 20:44:52 door Niels K
dan word dus bijvoorbeeld bij dit:
Dan word dit dus geencrypt als in sha1:
wachtwoord123qwe123qwe?
Is het dan niet veiliger om om de zoveel letters in een wachtwoord
een deel van de salt toe te voegen of eventueel de gehele salt?
Gewijzigd op 02/02/2011 20:52:28 door Mik PHP
Zelf gebruik ik altijd sha1(), omdat die moeilijker is om te brute force dan md5()
(correct me if i'am wrong)
of andersom, maar nu wil ik dus md5(sha1(salt())) gaan gebruiken.. Of misschien haal ik de hele md5 er wel uit aangezien hij vrij onveilig is..
Aan de ene kant is het beter want als ze de md5 hacken dan moeten ze die sha1 nog zien te hacken en als ze die gehackt hebben de salt nog
Gewijzigd op 02/02/2011 21:04:17 door Mik PHP
Simpel zoals ik zei:
Code (php)
1
2
3
4
2
3
4
<?php
$salt = 'as;dhaklwjtholwutlkajfliaguytaweuifhasjklfnaerhtapsduhfljkhan;';
$query = "INSERT INTO .. (...) VALUES( '" .sha1($_POST['password'] . $salt). "' )";
?>
$salt = 'as;dhaklwjtholwutlkajfliaguytaweuifhasjklfnaerhtapsduhfljkhan;';
$query = "INSERT INTO .. (...) VALUES( '" .sha1($_POST['password'] . $salt). "' )";
?>
goeie salt vind je niet? Was gewoon even 3 keer domweg wat toetsen indrukken :P
Gewijzigd op 02/02/2011 21:43:02 door Niels K
Code (php)
Zoals Niels zei, is encryptie over encryptie niet aan te raden. Maar dat los je (volgens mij dan) nu toch op door die salt toe te voegen.
Die salt die ik hierboven gepost heb die plakt stukjes van een omgekeerde salt
dus bijf:
$salt = "1234";
$pw = "niceworkdude"
daar maakt hij dan 4dude3nice2work1 van
dat dan nog even encrypten door sha1 en voila, sterk pw bijna niet te kraken toch?
Toevoeging op 02/02/2011 22:14:35:
PS: Op zich heeft niels gelijk.. want als je namelijk een wachtwoord hebt als: "Hallo"
en de md5 enctyptie zou dan bij wijs van spreken dsajdasd998u3jkd zijn en je hackt op de een of andere manier die sha dan zie je dit: gfbf7&#^EFBEAFVYIGR&r8gufbu8e5y';.'mhallo dan is hij op zich makkelijk te kraken.
Toevoeging op 02/02/2011 22:15:49:
Onee laat maar, dan zie je de geencrypte md5 nog ik ben moe, laat maar..
Toevoeging op 02/02/2011 22:16:08:
maar alsnog is die salt dan wel onnodig geweest.
Gewijzigd op 02/02/2011 22:15:45 door Mik PHP
En zo heb ik gelezen over "SHA256"
En dat deze geprefereerd wordt over md5 en sha1
Wat is jullie mening daarover?
Bijvoorbaat dank,
Groeten
Wouter H op 01/04/2011 12:24:27:
En zo heb ik gelezen over "SHA256"
En dat deze geprefereerd wordt over md5 en sha1
En dat deze geprefereerd wordt over md5 en sha1
MD5 is 32 characters.
SHA is 40 characters.
SHA256 is 256 characters, dus wat lastiger te kraken.
thanks
BV: (*^&^%$#@(*^&^%$#@!@#)*(*^&^%$#@
is dit ook veilig
Code (php)
Gewijzigd op 03/04/2011 13:39:11 door Maarten PHP
Ja, het gaat erom dat het wachtwoord niet te bruteforcen is. De password-string wordt gewoon aanzienlijk langer erdoor. Ook dictionairy-attacks behoren dan tot het verleden.
Is het te kraken?
Gewijzigd op 03/04/2011 13:33:42 door Maarten PHP