Avatar billede -kenner- Nybegynder
07. februar 2005 - 14:13 Der er 23 kommentarer og
1 løsning

Er det nødvendigt at kryptere password når de ligger i mysql data

Hej eksperter,

Jeg står og skal lave en side, med bruger login, og så tænkte jeg på om det er nødvendigt at kryptere koderne når de ligger i en mysql database..

Altså er det sikkert nok at undlade at kryptere passwords'ene?

Hvad mener I?

Mvh Kenneth

PÅ forhånd tak!
Avatar billede jpvj Nybegynder
07. februar 2005 - 14:16 #1
Password bør altid være krypteret eller hash'et.

Det mest normale er at lave en hash - ex. md5 - på passwordet. En hash funktioner er envejs, dvs. man kan "aldrig" finde frem til klartekst kodeordet.
Du kontrollerer et login, ved at tage hash værdien af det indtastede og sammenligne det med det hashede kodeord i databasen.
Avatar billede net-base.dk Nybegynder
07. februar 2005 - 14:19 #2
Hvordan laves dette hash funktion sidder nemlig og overvejer det samme...
Avatar billede davidskp Nybegynder
07. februar 2005 - 15:29 #3
et check i databsen for brugernavn og password (hashed med md5) kunne se sådan ud:

$query = mysql_query("SELECT brugernavn, password FROM login WHERE brugernavn = '".$_POST[brugernavn]."' AND password = md5('".$_POST[password]."')") or die(mysql_error());

læge mærke til md5('".$_POST[password]."') <- det indtastede password hashes og sammenlignes med det hashede password i databasen

/dave
Avatar billede gf Nybegynder
07. februar 2005 - 15:35 #4
Det samme som davidskp men lidt simplere

<?php
$streng = "streng der skal konverteres";
$password = md5($streng);
echo $password;
?>

mvh gf
Avatar billede -kenner- Nybegynder
07. februar 2005 - 16:26 #5
OKay, men  hvad så hvis brugeren har glemt sit password, og vil have det tilsendt med f.eks. mail?
Avatar billede gf Nybegynder
07. februar 2005 - 16:30 #6
Passwordet er "klartekst" men som davidskp's løsning foreskriver gemmes den hashede version i mysql databasen. Det er den hashede version af passwordet du sammenligner med det hashede password i databasen.

Mvh gf
Avatar billede coderdk Praktikant
07. februar 2005 - 17:34 #7
Hvis brugeren har glemt sit password, så kan du sende en URL til hans email hvor han kan ændre passwordet.
Avatar billede haren Nybegynder
07. februar 2005 - 20:25 #8
Eller ændre kodeordet til et tilfældigt.. :)
Avatar billede net-base.dk Nybegynder
07. februar 2005 - 21:01 #9
altså lidt lige som base64_encode og base64_decode, men bare kun mulighed for at kryptere det...
Avatar billede gf Nybegynder
07. februar 2005 - 21:05 #10
ja
Avatar billede net-base.dk Nybegynder
07. februar 2005 - 21:07 #11
okay...

hvad er fordelen ved md5 i stedet for at bruge base64_encode... med base64_encode kan man jo finde brugerens kode frem igen...
Avatar billede gf Nybegynder
07. februar 2005 - 21:21 #12
Hej

Jeg må indrømme. at jeg ikke er så meget inde i det tekninske omkring fordele og ulemper, men der er jo ingen grund til, at dekryptere for, at sammenligne. Så er md5 kryptering jo også let at anvende. Hvis du er meget meget fokuseret på sikkerheden kan du jo:

$password = md5((md5($streng));

men til almindlig brug vil det være lidt overkill

Mvh gf
Avatar billede net-base.dk Nybegynder
07. februar 2005 - 21:28 #13
kan godt se fordelen ved at kryptere kodeord. og det tager jo ikke specielt længere tid... men hvorfor ikke bare bruge base64_encode, i stedet for md5, syntes det er smartere når man tænker på at en bruger muligvis kan komme til at glemme sin kode og gerne ville have den sendte på email...

nå fuck det.. tror jeg sætter mig ned og læser lidt om de 2 muligheder...
Avatar billede coderdk Praktikant
07. februar 2005 - 21:39 #14
Sikkerhedsmæssigt er det ikke en god idé. Hvis en cracker kompromitterer systemet, vil han have adgang til alle brugeres passwords - Hvis de er krypteret kan han ikke gøre så meget.
Så jeg er pro-hashing og anti-klartekst ;)
Avatar billede gf Nybegynder
07. februar 2005 - 21:45 #15
jamen er jeg ikke også det?

mvh gf
Avatar billede net-base.dk Nybegynder
08. februar 2005 - 00:38 #16
coderdk -> Okay det kan man sige at være en rimlig god forklaring. nu kan jeg se fordelen med md5 i stedet for base64_encode.

Kenner -> Undskylder at jeg sådan har brudt ind i dit spørgsmål, men syntes netop dette emne var interesant at vide lidt om. og syntes det var dumt at have 2 spg åbne for at indhente lidt informationer.
Avatar billede gammelhat Nybegynder
08. februar 2005 - 00:51 #17
Det er også meget almindeligt at bruge en hemmelig nøgle, når hashen beregnes.

$hash = md5($password."noget hemmeligt");

Hvis en ubuden gæst får fat i databasen, kan han ikke bare gå i gang med at bruteforce passwords (svage password bliver også stærkere). Han skal også have kendskab til den hemmelige nøgle.

I beta versionen af den nye Eksperten var der et stort sikkerhedshul, som gjorde man kunne få udlæst md5 hashen af brugernes password. Disse kunne så umiddelbart bruteforces. Det kunne være besværliggjort med en hemmelig nøgle..
Avatar billede coderdk Praktikant
08. februar 2005 - 09:56 #18
Måden gammelhat beskriver er ofte brugt, dog på en lidt andet måde, og "nøglen" kaldes "salt":

$hash = md5( md5( $password ) . 'noget salt' );
Avatar billede -kenner- Nybegynder
08. februar 2005 - 15:29 #19
Men hvis i bruger en md5 kryptering, hvordan vil i så sende en brugers kodeord, hvis brugeren har glemt det?
Avatar billede gf Nybegynder
08. februar 2005 - 15:33 #20
Hej

Det sker ikke så tit, at mine brugere glemmer det. Hvis de gør får de et nyt.

Mvh gf
Avatar billede coderdk Praktikant
08. februar 2005 - 15:35 #21
Se min kommentar fra 07/02-2005 17:34:41
Eller gør som gf skriver, ændr det for dem og send det til dem.
Avatar billede Slettet bruger
09. februar 2005 - 00:55 #22
Bare for at gøre det helt klart: Hvis man benytter md5 er der ingen måde at få det egentlige kodeord frem igen. Det kan ikke lade sig gøre - og det er netop det, der er fidusen ved det. Man kan altså ikke sende en glemsom brugers kodeord. I stedet har man f.eks. en funktion, der kan generere et ny kodeord og sende det til brugeren.

Det betyder naturligvis ikke, at man ikke kan bruge bruteforce-metoden (som gammelhat omtalte) til at finde en streng, der giver samme md5sum, som koden. En md5sum er på 128 bit, så der er trods alt "kun" 2^128 forskellige mulige, så hvis man afprøver nok forskellige strenge, skal man nok finde en, som giver samme md5sum. Det er sandsynligvis ikke den ægte kode, men hvis bare den virker lige så godt, kan det jo også være ligegyldigt.

Da JavaScript også har md5 indbygget, kan man bruge det til at undgå at sende det ukrypterede kodeord ved indlogning. Metoden er egentlig ganske simpel:

Serversiden laver et salt, som sættes som et skjult felt i login-formularen. Dette salt bør være unikt. Det gemmes i en session-variabel.

Formularen laves, sådan at når den bliver sendt, bliver der først kørt et javascript, som tager md5(md5(kodeord) + salt) og sender dette i stedet for klartekstkodeordet.

Når formularen modtages af serveren, sammenlignes med databasen i stil med if($_POST['kodeord']==md5($row['kodeord'] . $_SESSION['salt']))

Bemærk, at denne metode gør login en lille smule mere sikkert, men hvis man ønsker rigtig sikkerhed, bør man bruge en krypteret forbindelse (SSL). Det eneste, denne metode beskytter mod er opsnapning af kodeordet.
Avatar billede -kenner- Nybegynder
25. februar 2005 - 23:35 #23
Jeg kunne godt tæke mig et brutoforce script, så jeg selv kan tjekke sikkerheden på mine sider..

Hvad er fremgangsmåden, og er der et script man benytter?
Avatar billede Slettet bruger
26. februar 2005 - 01:07 #24
Hvis dine sider er lavet ordentligt (så uvedkommende ikke kan få adgang til md5-koderne i databasen), så kan man ikke afprøve sikkerheden i dine sider med bruteforce-metoden. Man vil højst kunne finde usmarte passwords.

Metoden er ganske simpel, og det er også derfor, den kaldes brute force, som løseligt oversat betyder råstyrke. Det handler altså om at bruge rå regnekraft og repetition og ikke nogen kompliceret algoritme.

Hvis du for eksempel har en kuffert med kodelås, som har tre tal, så ville bruteforce-metoden til at komme ind være at starte med 000, derefter 001 osv. indtil 999. På et eller andet tidspunkt vil jeg have fundet den rette kode.

Nu er PHP ikke det smarteste sprog at bruge til at forsøge et bruteforceangreb på en md5-sum, men her er et lille eksempel:

<?php

$hemmelig="Her er en kode";
$krypteret=md5($hemmelig);

$testtegn='abcdefghijklmnopqrstuvwxyzæøå1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ,._-*|+?=)(/&%¤#"!@£${[]} ";

function bruteforce($streng=''){
  global $testtegn;
  global $krypteret;
  $match=FALSE;
  for($i=0;$i<=strlen($testtegn)||!$match;$i++){
    $teststreng=$streng . substr($testtegn,$i,1);
    $match= ( md5($teststreng) == $krypteret?$teststreng:FALSE);
    if(strlen($teststreng)<=10 && $match!==FALSE){
      $match=bruteforce($teststreng);
    }
  }
  return $match;
}

$resultat=bruteforce();
if($resultat!==FALSE){
  echo $resultat . ' kan bruges som kode.";
}
?>

Bemærk, at koden nok ikke vil kunne køre på webhoteller, og hvis du vil køre den på en egen server, skal du nok pille lidt ved indstillingerne først. Det er nemlig en krævende algoritme. Derudover forsøger den kun op til 10 tegn for ikke at kræve alt for meget.
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