Kryptera lösenord
12 svar · 620 visningar · startad av stevenet
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.
------------------
Robban < robban@lipogram.com >
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>
------------------
woodi
[Redigerat av woodi den 13 aug 2000]
Robban
Hur avkrypterar Du krypteringar som gjorts med Password() i mySQL!? Vad jag vet så går inte detta heller..
------------------
woodi
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.).
------------------
Robban < robban@lipogram.com >
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! ;)
------------------
woodi
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.
------------------
Robban < robban@lipogram.com >