Kryptera lösenord

PHP

12 svar · 632 visningar · startad av stevenet

Medlem sedan juni 20001 251 inlägg
Trådstart#1

Hur krypterar och avkrypterar jag ett lösenord?

Medlem sedan feb. 20001 270 inlägg
#2

Kolla crypt() i PHP manualen.

Eller också Password() i mySQL manualen.

Medlem sedan dec. 19992 555 inlägg
#3

Bör väl kanske nämnas att crypt() och md5() (som också kan användas - kan t.o.m. vara att föredra) är envägskrypteringar. D.v.s. det går inte att "avkryptera" (dekryptera) någonting krypterat med dessa funktioner.

Men det skall inte gå heller, om man vill ha ett säkert lösenordssystem. Man lagrar lösenordet krypterat. När man skall kolla användarens lösenord så frågar man efter det, kryperar det (med samma "salt") och jämför detta krypterade lösenord med det man har lagrat. Om de stämmer överens så har användaren angett rätt lösenord.

Medlem sedan juni 20001 251 inlägg
#4

Tackar! Är det någon som har ett kodexempel?

Medlem sedan feb. 20001 270 inlägg
#5

Denna koden crypterar lösenordet och stoppar in i databasen.

createpassword.php

$password="kalle";
$salt="1zH";
$password=crypt($password, $salt);
mysql_query("update tabellen set password='$password'");

Sen har Du ett inloggningsformulär med bl.a. ett lösenordsfält.

inlogg.php

<?
  if($submit){
    $salt="1zH";
    $Fpassword=crypt($Fpassword, $salt);
    $res=mysql_query("select password from tabellen where user='$Fuser'");
    $row=mysql_fetch_array($res, MYSQL_ASSOC);
    if(mysql_numrows($res)==1){
      if($Fpassword==$row[password])
        echo "Grattis Du har behörighet!";
      else
        echo "Fel lösenord!";
    }else
      echo "Användaren finns inte!";
  }
?>

<html>
<head></head>
<body>
<form action="inlogg.php" method="post">
Användarnamn:<br>
<input type='text' name='Fuser'><br>
Lösenord:<br>
<input type='password' name='Fpassword'><br>
<input type='submit' name='submit' value='Logga in'>
</form>
</body>
</html>
Medlem sedan feb. 20001 270 inlägg
#6

Robban
Hur avkrypterar Du krypteringar som gjorts med Password() i mySQL!? Vad jag vet så går inte detta heller..

Medlem sedan dec. 19992 555 inlägg
#7

Nope, går inte att dekryptera MySQL's PASSWORD() heller (är som sagt det normala när det gäller lösenord). Inte heller med ENCRYPT(), som är en annan funktion i MySQL.

Appropå ditt exempel. För bästa säkerhet bör man slumpa fram "saltet" och inte använda samma varje gång (normallängden är dessutom två tecken - ditt sista tecken kommer att slängas bort helt enkelt). För att senare veta vilket "salt" som användes för ett specifikt lösenord så tittar man på de två första tecknen i det krypterade lösenordet (om DES används för krypteringen).

Lite osäker på om crypt() fungerar på alla system (Win32 t.ex.)? Tror inte det? Var därför jag skrev att md5() kan vara att föredra (även om MD5 egentligen inte är avsedd till detta - har dock mindre praktisk betydelse). För md5() vet jag fungerar på Win32 (om man nu bryr sig om Win32-kompatibilitet ö.h.t.).

Medlem sedan dec. 19991 749 inlägg
#8

Crypt(); funkar icke på win32. Satt hela helgen och slet i mitt hår för att jag inte fick det att funka. Förbannat att man inte kan ge sina användare större säkerhet pga att webhotellet kör windows.

Medlem sedan feb. 20001 270 inlägg
#9

Robban
Så sant så sant.. Men ett exempel script efterfrågades och jag slängde ihop ett lite snabbt.. Lite får väl personerna ifråga göra själva! ;)

Medlem sedan juni 20001 251 inlägg
#10

Hur slumpar man fram "saltet"?

Medlem sedan feb. 20001 270 inlägg
#11

Kolla srand() och rand() i phpmanualen.

Medlem sedan dec. 19996 592 inlägg
#12
$verify="38fe8951595f01a3c16f3d50ea0bcc53";
$password=md5($losenord);
if($password==$verify)
echo "blablabla";

Tillräckligt säkert för ett admin-system för en gästbok?

Medlem sedan dec. 19992 555 inlägg
#13

nanne:

Du kan använda md5(). Ger i stort sett lika bra säkerhet som crypt() och skall fungera på Win32.

Matti:

Japp, det tycker jag. Problemet (om man nu skall kalla det så) med md5() är att det egentligen inte är en krypteringsalgoritm utan en s.k. "message digest". Innebär i klartext att det finns flera indata som ger samma utdata. Detta är ju inte så bra när det gäller en lösenordsfunktion, men chansen att detta skall ställa till med problem är i stort sett obefintlig.

Sedan är ett annat "problem" att PHPs md5() inte använder "salt" som crypt() gör, vilket sänker säkerheten en del. Men detta får man leva med om man vill att sidan skall vara Win32-kompatibel. Säkerheten blir bra nog för de flesta tillämpningar.

274 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
136 ms — ändringar (db)