WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   sha1 och salt (https://www.wn.se/forum/showthread.php?t=1038457)

AnOnYmUs 2009-10-09 11:59

sha1 och salt
 
Tjo.

Satt uppe hela natten och gav mig på sha1 och salt för första gången. Innan jag ställer min fråga här vill jag först påpeka att mina php-kunskaper är 0.1, och att jag normalt sett aldrig ger mig på sånt här. Men hur som helst, jag satt och pillade i ett script och lyckades få registreringen i scriptet till att sha1+salta lösenordet innan det sparades i db:n.

Problemet jag nu sitter med är inloggningen där jag inte får det att fungera. Jag läste om hur man kunde göra via en engelskspråkig sida och det mesta var ganska simpla saker.

Nu är problemet att när jag vänder proceduren för att kolla lösenordet som användaren skriver in är lika det som finns i db:n så fungerar det inte. Just den här kodsnutten får jag inte att fungera:

$sql="select password,active from members where username='".$_POST['username']."'";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
$dbpass=$row[0];
$active=$row[1];
}
$salt="abcdefhijklmn";
$password=$_POST['password'];
if($dbpass==sha1($salt.$password))
{

Så min fråga är, vad kan det bero på? Har jag missat ngt. Tacksam för förslag, men försök gärna ge förslag om vad det är för fel på just denna, för jag tror inte att längre ombyggda koder för mig smartare just nu (har sovit 3 timmar) :P

Tack! //AnOn

fabian 2009-10-09 12:21

Citat:

Ursprungligen postat av AnOnYmUs (Inlägg 20325563)
Tjo.

Satt uppe hela natten och gav mig på sha1 och salt för första gången. Innan jag ställer min fråga här vill jag först påpeka att mina php-kunskaper är 0.1, och att jag normalt sett aldrig ger mig på sånt här. Men hur som helst, jag satt och pillade i ett script och lyckades få registreringen i scriptet till att sha1+salta lösenordet innan det sparades i db:n.

Problemet jag nu sitter med är inloggningen där jag inte får det att fungera. Jag läste om hur man kunde göra via en engelskspråkig sida och det mesta var ganska simpla saker.

Nu är problemet att när jag vänder proceduren för att kolla lösenordet som användaren skriver in är lika det som finns i db:n så fungerar det inte. Just den här kodsnutten får jag inte att fungera:

$sql="select password,active from members where username='".$_POST['username']."'";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
$dbpass=$row[0];
$active=$row[1];
}
$salt="abcdefhijklmn";
$password=$_POST['password'];
if($dbpass==sha1($salt.$password))
{

Så min fråga är, vad kan det bero på? Har jag missat ngt. Tacksam för förslag, men försök gärna ge förslag om vad det är för fel på just denna, för jag tror inte att längre ombyggda koder för mig smartare just nu (har sovit 3 timmar) :P

Tack! //AnOn

Varför inte:

PHP-kod:

$sql="SELECT password, active FROM members WHERE username = '".$_POST['username']." AND password = SHA1('".$_POST['password']."' + 'abcdefhijklmn');"


taz76 2009-10-09 12:41

AnOn -> läs på om sql injections ;)

fabian 2009-10-09 13:10

Ja precis, glömde kommentera det, men du borde verkligen validera indata innan du kör in det i ett mysq-query!

http://webdesignskolan.se/php/mysql_...njections.html

AnOnYmUs 2009-10-09 13:34

Okej, ska jag lägga till mysql_real_escape_string då?

$password=mysql_real_escape_string($_POST['password']); exempelvis?

Johan_S 2009-10-09 13:36

Precis så, men gör detta endast på data som du sedan ska köra i SQL querys av olika slag. Du bör även kontrollera om ett siffervärde är ett siffervärde osv, förutsätt att användaren inte vet vad denna gör.

AnOnYmUs 2009-10-09 13:43

Tack för svaren och tipsen. Känns dock som om jag behöver lösa just delen med sha1 o salt först, innan jag ger mig på det andra.

Johan_S 2009-10-09 14:00

Läsning: http://us3.php.net/manual/en/function.sha1.php

Testa att köra salt och kontrollera manuellt om salten stämmer, kan vara små saker som att du inte har tillräcklig längd på fältet i databasen som strular.

Lite exempel som jag tror ska vara duliga (otestat):

//Definera salt
$salt = "abcdefhijklmn";

//Ta emot formulärdata
$user = mysql_real_escape_string($_POST['username']);
$pass = mysql_real_escape_string(($_POST['pass']);

//Salta lösen
$pass_salted = sha1($salt.$pass));


$result_getUser = mysql_query("SELECT password,active FROM members WHERE username='$user' AND password = '$pass_salted'");

if (mysql_num_rows($result_getUser) == 0){

//Fel lösen eller ingen användare
exit;

} else {

//Sätt session för inloggning eller visa hemlig sida

}

AnOnYmUs 2009-10-09 14:23

Citat:

Ursprungligen postat av Johan_S (Inlägg 20325595)
Läsning: http://us3.php.net/manual/en/function.sha1.php

Testa att köra salt och kontrollera manuellt om salten stämmer, kan vara små saker som att du inte har tillräcklig längd på fältet i databasen som strular.

Lite exempel som jag tror ska vara duliga (otestat):

//Definera salt
$salt = "abcdefhijklmn";

//Ta emot formulärdata
$user = mysql_real_escape_string($_POST['username']);
$pass = mysql_real_escape_string(($_POST['pass']);

//Salta lösen
$pass_salted = sha1($salt.$pass));


$result_getUser = mysql_query("SELECT password,active FROM members WHERE username='$user' AND password = '$pass_salted'");

if (mysql_num_rows($result_getUser) == 0){

//Fel lösen eller ingen användare
exit;

} else {

//Sätt session för inloggning eller visa hemlig sida

}

Du hade helt rätt, varchar(12) <- där hade vi ett stort problem :)

SimonP 2009-10-09 14:25

Lägg helst saltet sist eller på båda sidorna (ändå bättre) för att försvåra bruteforce-attacker. Exempel:
$pass_salted = sha1($salt.$pass.$salt);


Alla tider är GMT +2. Klockan är nu 15:22.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson