Avatar billede tobrukDk Novice
17. april 2012 - 22:11 Der er 11 kommentarer og
1 løsning

sikker på password

Hej


Det er sådan at jeg har læse rundt omkring på nette at "ligge" salt på et password eller hasl eller hvordan man staver til det på dansk.

så komme jeg ind på en hjemmeside hvor de viser det osv, men jeg forstår virkelig ikke hvordan man bygge det op sådan at det bliver mere svært at finde ud af hvad kode er til brugers adgangskode..

har fundet den her;
http://net.tutsplus.com/tutorials/php/understanding-hash-functions-and-keeping-passwords-safe/

er der nogle som vil lærer mig det så at de bruger som opret sig ind på min hjemmeside de for en mega sikker bruger.


Håber du vil lærer mig det :D
Avatar billede inteeeL Nybegynder
17. april 2012 - 23:07 #1
Hele essensen i det at bruge et salt på sit krypteret password ligger i, at man skal forhindre ens hash/krypteret kodeord i at kunne blive slået op i en rainbow-tabel.

Forklaring:
Når du krypterer en string (eksempelvis en kode) med md5 eller SHA1, vil du altid få den samme hashværdi bestående af 32 karakterer, den samme krypteret kode. Det er i sig selv fint nok, og så alligevel ikke. Der findes noget, der hedder rainbow-tabeller. Dette er tabeller, hvor du kan slå hashværdier op - hvis de findes i databasen, kan du retur få den oprindelige værdi.

Eksempel:
echo md5("heste");

Ovenstående vil returnerer "33c760c9e54eae0ffbb4c5ff696dfbc6" <- altid. I en rainbowtabel kan du så slå hashværdien. Hvis der værdien findes i deres databasen, kan du retur få værdien "heste". Hvis du i stedet tilføjer et salt, en værdi som kun DU kender, til din anden værdi, vil hashværdien bliver genereret ud fra kodeordet og saltet. Da kun du kender denne saltværdi, vil det ikke være muligt at slå det op i en rainbowtabel, da de ikke kender din saltværdi.

Salt kan med fordelagtig virkning anvendes for at øge sikkerheden. Bemærk, dette emne behandles kun, hvis en hacker, rent hypotetisk, fik fingrene i dine krypterede koder.

Læs evt. om det her: http://www.eksperten.dk/guide/1051
Avatar billede tobrukDk Novice
18. april 2012 - 00:21 #2
#inteeeL

Der stå intet om hvordan jeg bygge det op til at være salt eller lign?.


Hvad mener du helt med det her ;

Salt kan med fordelagtig virkning anvendes for at øge sikkerheden. Bemærk, dette emne behandles kun, hvis en hacker, rent hypotetisk, fik fingrene i dine krypterede koder.
Avatar billede rix Praktikant
18. april 2012 - 02:59 #3
Hej man kan bygge det op sådan her

når en bruger opretter sig sker der følgende
du laver en unik kode. dette kode kan være hvad som helst tal. bogstaver ol.
du tilføjer det til brugerens kode så hvis brugeren vægler at have "123" som sin kode og du har en salt som er "dig" kan du lave det så at du gemmer "dig123dig" eller virkelig teknisk "1dig2dig3dig".

dette gemmer du så i din database som hans password. samt at du gemmer "dig" i en kolonne for sig selv.

når brugeren så ville logge ind gøre du følgende
kontrollere om du har en brugernavn gemt i database.
du tager så Salten som i min simple eks. er dig.
du blander så dig på den måde du valgte at gemme hans password (dig123dig eller 1dig2dig3dig) og kontrollere om det er brugerens password.

hvis det er så kan du lade ham se indholdet eller hvis ikke sender du det vider.

jo mere teknisk du gøre dette jo beder er det.
når jeg laver dette laver jeg Salten lang og blander bogstaver og tal sammen. og ingen af mine bruger har den samme salt.
og selvf. jo længere Salten er jo mindre er sandsynligheden for at nogle gætter den

men selvf. er kæden ikke stærkere end det svageste led. salt er kun en muglighed for at gøre en del af kæden sikker. hvis en person kommer i kontakt med din database og kan trække oplysninger fra den uden at være logget ind så ville salt mugligheden være nytteløs.


hvis du ville have en eks. kan jeg godt lave en. men så ville det ikke være i mysqli som er langt at fortrække (mysqli er ikke lige min stærke side ^^)
Avatar billede mireigi Novice
18. april 2012 - 03:54 #4
Nemmeste måde at bygge et Salt på, er at lave en MD5 for tidspunktet en bruger bliver oprettet.

Alt herunder er pseudokode, da jeg ikke kender noget til PHP.


password = md5("password")
salt = md5("2012-04-18 03:40:00.000")
encryptedPassword = md5(password + salt)

Derefter gemmer du både salt og encryptedPassword i din database for den pågældende bruger.

Når en bruger så prøver at logge ind, gør du således:

password = (hent fra det indtastede password i login formen)

salt = (hent fra basen ud fra indtastet brugernavn i login formen)
encryptedPassword  (hent også fra basen)

if (encryptedPassword = md5(md5(password) + salt))
  logik der laver session for at brugeren er logget ind
end if



Angående dit sidste spørgsmål, så er salt kun nødvendigt i tilfælde af at en hacker får adgang til din database og kan trække alle data ud.

Da alle passwords er gemt som MD5, genereret ud fra MD5 af indtastet password + salt, vil alle informationerne være ubrugelige.

Du kan læse lidt mere om det her:
http://www.pixel2life.com/publish/tutorials/118/understanding_md5_password_encryption/
Avatar billede Slettet bruger
18. april 2012 - 08:49 #5
Hvis jeg har forstået det korrekt er ÅRSAGEN til, at man "salter" (og krypterer i det hele taget) passwords, at sikre at en bandit ikke kan se brugeres passwords, selvom hun har fået adgang til den database hvor de er gemt.

Og det er der jo ikke noget galt i.

Men, hvis banditten har haft helt med at stjæle databasen, er der ret stor sandsynlighed for at hun også har adgang til den source som blev benyttet til at kryptere (og salte) password'ene - og derfor relativt let kan "reverse engineer" metoden - og derefter rainbow/brute-force knække brugernes (typisk lette) passwords.

Det skader selvfølgelig ikke, men er mest "prikken over i'et" på et i forvejen top-hærdet system.
(Lidt ligegyldigt i ét med "nøgne" $_POST-variabler direkte i mysql-queries)

Eller tager jeg helt fejl ?
Avatar billede olebole Juniormester
18. april 2012 - 14:27 #6
<ole>

Det er klart, at hvis en angriber har fået adgang til at 'spadsere frit rundt' på serveren, er alle sikkerhedstiltag forgæves - og så har vedkommende også adgang til salt algoritmen. Sådan foregår det dog yderst sjældent.

Et angreb begynder ofte med, at angriberen skaffer sig informationer om databasens opbygning. Det kan ske ved at rette forespørgsler, der formodes at udløse fejl. Skræmmende mange udviklere glemmer nemlig at slette deres fejlmeldinger i koden, inden sitet lægges på en server med offentlig tilgang.

$result = mysql_query(' ... ') or die (mysql_error());

- må aldig findes på en server med offentlig adgang! Det er kun til udvikling! Ligeledes må PHP's fejlmeldinger heller ikke være ukritisk slået til, når sitet går live. De kan også give en masse nyttige informationer om, hvordan sitet bedst angribes.

Derefter vil man som oftest forsøge sig med forskellige SQL-injections, hvilket kan resultere i, at angriberen får listet alle eller mange passwords fra databasen. Her er det, at rainbow tabeller kommer ind i billedet, og så er det en stor fordel, at man har saltet sine hashede værdier.

Her er fænomenet 'databasebruger' overordentlig vigtigt! En bruger, der bare læser sider - eller som er på vej til at logge sig ind - må aldrig have adgang til at foretage andet end SELECT i databasen. Alt for tit oprettes kun én databasebruger, som har adgang til alt. Denne bruger anvendes efterfølgende til alt, hvilket er den sikre opskrift på 'serverdød'!

Den databasebruger, som der logges ind i databasen med, må kun have adgang til at foretage det allermest nødvendige for den pågældende handling.

Saltede værdier er meget mere end blot "prikken over i'et" på et i forvejen tophærdet system. Alt for ofte er der tale om en forkromning af et rustent, gammelt vrag - som den stolte ejer dog ser som en luksuslimousine  *o)

SQL-injections sikrer man sig ikke mod ved at escape med f.eks. mysql_real_escape_string. I stedet bruger man parametriserede kald med prepared statements under MySQLI eller PDO.

Derudover er det overordentlig vigtigt, at man effektivt holder styr på sine fejlmeldinger.

Sikkerhed er ikke noget, man sørger for ét sted. Det er summen af en masse tiltag, hvoraf salt er én af mange  =)

/mvh
</bole>
Avatar billede Slettet bruger
18. april 2012 - 15:06 #7
Ups, dén med databasebrugeren skal jeg vist liige have overvejet lidt nøjere..
- Tak : )
Avatar billede tobrukDk Novice
19. april 2012 - 18:49 #8
skal jeg bygge det op sådan at det kommer til at se sådan ca ud som her


<?php
$string = 'Something';
$hash = md5($string);
echo $hash;
?>


eller skal jeg gøre sådan her


<?php
$string = 'something';
$salt = 's+(_a*';
$hash = md5($string.$salt);
?>
Avatar billede olebole Juniormester
19. april 2012 - 19:20 #9
#2 er bedre end #1. Du kunne også skrive:

<?php
$string = 'something';
$salt = md5('s+(_a*');
$hash = md5($string.$salt);
?>
Avatar billede tobrukDk Novice
21. april 2012 - 18:10 #10
#9 Olebole er sha1 ikke bedre endnu md5 ??

Hvor henne i den her kode vil du "ligge" salt ind


<?php
    session_start();
 
    include("include/database/db.php");
 
    $email = $_POST["email"];
    $password = $_POST["password"];
   
    $error = "";
 
    $userQuery = mysql_query("SELECT * FROM brugere WHERE email='$email'") or die(mysql_error());
 
    if(mysql_num_rows($userQuery) < 1)
    {
        header("Location: login.php");
        exit();
    }
    else
    {
        $userArray = mysql_fetch_array($userQuery);
   
        if($userArray["password"] != sha1($pass))
        {
            header("Location: login.php");
            exit();
        }
    }

    if($error != "") {
        header("Location: login.php");
        exit();
    }
    else
    {
        $_SESSION["logged_in"] = true;
        $_SESSION["user_id"] = $userArray["id"];
        $_SESSION["djnavn"] = $userArray["djnavn"];
        $_SESSION["hemmelig"] = $userArray["hemmelig"];
        $_SESSION["rank"] = $userArray["rank"];
        if($userArray["rank"] == 0)
        {
            header("Location: http://djinfo.dk/blocker.php");
            exit();
        }
        if($userArray["rank"] == 1)
        {
            header("Location: http://djinfo.dk/bruger_index.php");
            exit();
        }
        if ($userArray['rank']==2) {
            header("Location: http://djinfo.dk/admin-forside/");
            exit();
        }       
    }   
?>


det er til når bruger skal log ind hvor den tjek det hele?.. :)


Dette her er opret del & tror at jeg ligge det lige før at man ligge det ind i database. ? eller hvad skal jeg gøre det?


<?php
            if(!empty($_POST))
            {
                $email = mysql_real_escape_string($_POST["email"]);
                $password = $_POST["password"];
                $gentag = mysql_real_escape_string($_POST["gentag"]);
                $djnavn = mysql_real_escape_string($_POST["djnavn"]);
                $profiltekst = mysql_real_escape_string($_POST["profiltekst"]);
                $facebook = mysql_real_escape_string($_POST["facebook"]);
                $club = mysql_real_escape_string($_POST["club"]);
                $booking = mysql_real_escape_string($_POST["booking"]);
                $hemmelig = mysql_real_escape_string($_POST["hemmelig"]);
                $pris = mysql_real_escape_string($_POST["pris"]);
                $id_katogori  = mysql_real_escape_string($_POST['katogori']);
                $mobil = mysql_real_escape_string($_POST["mobil"]);


                $billedefilnavn = null;
       
                include ("include/class.upload.php");
                $handle = new Upload($_FILES["file"]);
               
                if($handle->uploaded)
                {
                    //lidt mere store billeder
                    $handle->image_resize = true;
                    $handle->image_ratio_y = true;
                    $handle->image_x = 220;
                    $handle->Process("profil/big_img");
                   
                    //til profil billede lign..
                    $handle->image_resize = true;
                    $handle->image_ratio_crop = true;
                    $handle->image_y = 75;
                    $handle->image_x = 75;
                    $handle->Process("profil");
                   
                    $billedefilnavn = $handle->file_dst_name;
                       
                            echo '<p>Billedet: ' . $billedefilnavn . '<br></p>';
                            echo "<p>Dit billede blev upload<br></p>";
                }else{
                    $billedefilnavn = 'bruger_intet.png';
                }
                $bruger = mysql_query("SELECT NULL FROM brugere WHERE email='$email'");
                if(mysql_num_rows($bruger) > 0)
                    {
                        echo "<div id=\"box\"><ul><li>Email er optaget, Pr&#248;ve igen</li></ul></div>";
                    }
                else
                {
                   
                    $code = rand(111111111, 999999999);
                   
                    //sende email til brugere
                   
                    $to = $email;
                    $subject = "Activate din brugere";
                    $headers = "From: support@djinfo.dk";
                    $body = "Hej, \n \n Du er opret og du skal her med nu activate din konto. \n \n klik p&#65533; det her link eller kopie det oppe i din URL bar i din browser \n \n http://......dk/activate.php?code=$code \n \n Takker for det Hilsen Djinfo.dk \n \n Du kan ikke svar p&#65533; den her email";
                   
                   
                   
                    $errors = array
                    (
                        "email" => "Husk du skal indtaste en email som brugernavn.",
                        "password" => "Husk du skal indtaste et password.",
                        "gentag" => "Husk de to passwordfelter skal have ens indhold og password.",
                        "djnavn" => "Husk at inds&#65533;t Djnavn.",
                        "profiltekst" => "Husk at tilf&#65533;j noget profil tekst.",
                        "facebook" => "Husk at tilf&#65533;j ritgit facebook.",
                        "booking" => "Husk Booking Email.",
                        "hemmelig" => "Husk hemmelig kode ord.",
                        "pris" => "Husk en pris.",
                        "club" => "Husk club sted."
                    );
                   
                    if(!empty($pris))
                    {
                        unset($errors["pris"]);
                    }
                    if(!empty($club))
                    {
                        unset($errors["club"]);
                    }
                    if(!empty($email))
                    {
                        unset($errors["email"]);
                    }
                    if(!empty($password))
                    {
                        unset($errors["password"]);
                    }
                    if(!empty($gentag) && $gentag == $password)
                    {
                        unset($errors["gentag"]);
                    }
                    if(!empty($djnavn))
                    {
                        unset($errors["djnavn"]);
                    }
                    if(!empty($profiltekst))
                    {
                        unset($errors["profiltekst"]);
                    }
                    if(!empty($facebook))
                    {
                        unset($errors["facebook"]);
                    }
                    if(!empty($booking))
                    {
                        unset($errors["booking"]);
                    }
                    if(!empty($hemmelig))
                    {
                        unset($errors["hemmelig"]);
                    }
                   
                    if(empty($errors))
                    {
                        if(!mail($to, $subject, $body, $headers))
                        {
                            echo 'Vi kunne ikke logge dig p&#65533; dette tidspunkt. Plases pr&#65533;v igen senere';
                        }
                        else
                        {
                            $password = sha1($salt);
                            $insert = mysql_query("INSERT INTO brugere (code,email,password,katogori,profilbillede,djnavn,profiltekst,facebook,club,pris,booking,hemmelig,mobil)
                            VALUES ('$code','$email','$password','$id_katogori','$billedefilnavn','$djnavn','$profiltekst','$facebook','$club','$pris','$booking','$hemmelig','$mobil')");       
                        }
                           
                            if(!$insert)
                            {
                                echo "fejl";
                            }
                            else
                            {
                                echo "<div id=\"box\"><ul><li>Godkendt brugere</li></ul></div>";
                            }
                        }
                        else
                        {
                            echo "<div id=\"box\"><h4>HUSK DET HER!!</h4><ul><li>" . implode("</li><li>", $errors) . "</li></ul></div>";
                        }
                }
            }
        ?>
Avatar billede tobrukDk Novice
23. april 2012 - 00:06 #11
jeg tag den op igen når jeg har lavet det om til mysqli :)
Avatar billede tobrukDk Novice
23. april 2012 - 00:06 #12
lukker lige selv den her gang
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester