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);

AnOnYmUs 2009-10-09 14:25

Åter igen, tack för alla svar och tips :) Nu funkar iallafall den biten.

Johan_S 2009-10-09 14:27

Citat:

Ursprungligen postat av AnOnYmUs (Inlägg 20325599)
Du hade helt rätt, varchar(12) <- där hade vi ett stort problem :)

Perfekt, då kan man ta helg snart med hedern ibehåll. ;)

tartareandesire 2009-10-09 17:01

Citat:

Ursprungligen postat av AnOnYmUs (Inlägg 20325599)
Du hade helt rätt, varchar(12) <- där hade vi ett stort problem :)

Hehe, det blir lite mer av en utmaning att logga in då :) Har själv råkat göra samma sak, ganska lätt hänt om man är lite för snabb i phpMyAdmin.

Som Simon säger så bör du helst lägga salt på bägge sidor och då gärna ett användarspecifikt sådant.

tartareandesire 2009-10-09 19:55

En sak till förresten, vid felsökning (då det inte handlar om rena syntaxfel) så är det ofta en bra idé att skriva ut strategiska värden. På så vis brukar det gå snabbt att hitta var felet ligger.

AnOnYmUs 2009-10-10 00:06

Citat:

Ursprungligen postat av tartareandesire (Inlägg 20325658)
En sak till förresten, vid felsökning (då det inte handlar om rena syntaxfel) så är det ofta en bra idé att skriva ut strategiska värden. På så vis brukar det gå snabbt att hitta var felet ligger.

Jo men nu var det så att jag hade 0.1 kunskaper i php :) Anledningen till att jag inte ens tittade på dbn var för att jag skrev om ett gammalt script, eller rättare sagt, ändrade i ett gammalt script. Därav kom jag inte ens på tanke på att det kunde ha med längden att göra :)

Data33 2009-10-10 03:30

Citat:

Ursprungligen postat av SimonP (Inlägg 20325600)
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);


Helst bör man inte köra med -bara- statiskt salt. Ett tips kan vara att salta med både ett statiskt salt, samt användar-id eller login eller något som är unikt för den raden. På så sätt kan flera användare ha samma lösenord utan att det går att se på hashen.

SimonP 2009-10-10 10:17

Citat:

Ursprungligen postat av Data33 (Inlägg 20325700)
Helst bör man inte köra med -bara- statiskt salt. Ett tips kan vara att salta med både ett statiskt salt, samt användar-id eller login eller något som är unikt för den raden. På så sätt kan flera användare ha samma lösenord utan att det går att se på hashen.

Jo jag är fullt medveten om det :) jag glömde lägga in länkarna där vi tidigare pratat om detta ämne:
http://www.wn.se/t30777.html
http://www.wn.se/t27900.html

tartareandesire 2009-10-10 16:40

Citat:

Ursprungligen postat av Data33 (Inlägg 20325700)
Helst bör man inte köra med -bara- statiskt salt. Ett tips kan vara att salta med både ett statiskt salt, samt användar-id eller login eller något som är unikt för den raden. På så sätt kan flera användare ha samma lösenord utan att det går att se på hashen.

Exakt samma sak står ett par inlägg innan ditt :)

BjörnJ 2009-10-12 06:55

Citat:

Ursprungligen postat av Johan_S (Inlägg 20325595)
//Ta emot formulärdata
$user = mysql_real_escape_string($_POST['username']);
$pass = mysql_real_escape_string(($_POST['pass']);

Det är onödigt att köra mysql_real_escape_string() på lösenordet eftersom det hashas och aldrig skickas i klartext till databasen.

Använd gärna trim() också (på både lösenord och annat).


Alla tider är GMT +2. Klockan är nu 20:38.

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