Avatar billede slein55 Mester
03. september 2023 - 17:22 Der er 9 kommentarer og
1 løsning

login med password_hash

er der nogen måde man kan sammenligne password gemt i SQL med $pass=password_hash($password, PASSWORD_BCRYPT), med et man indtaster i login?
Avatar billede repox Seniormester
03. september 2023 - 17:59 #1
Avatar billede slein55 Mester
03. september 2023 - 20:34 #2
jeg fandt den verify og kørte et eksempel det gik ok.. men kan ikke lige få den sat ind i dette eksempel i min DB er mit password lavet om med password_hash:

<?php
  include("config.php");
  session_start();
 
  if($_SERVER["REQUEST_METHOD"] == "POST") {
      // username and password sent from form
     
      $myusername = mysqli_real_escape_string($db,$_POST['username']);
      $mypassword = mysqli_real_escape_string($db,$_POST['password']);
     
      $sql = "SELECT id FROM admin WHERE username = '$myusername' and passcode = '$mypassword'";
      $result = mysqli_query($db,$sql);
      $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
      $active = $row['active'];
     
      $count = mysqli_num_rows($result);
     
      // If result matched $myusername and $mypassword, table row must be 1 row
       
      if($count == 1) {
        session_register("myusername");
        $_SESSION['login_user'] = $myusername;
       
        header("location: welcome.php");
      }else {
        $error = "Your Login Name or Password is invalid";
      }
  }
?>
Avatar billede bvirk Guru
03. september 2023 - 22:31 #3
password må gemmes på server - det man bør gemme er noget som bruges til at chekke om password er korrekt - uden at dette noget kan bruges til frembringe password  - krypteret gemt som sammenlignes med kryptering af postet password.
Avatar billede arne_v Ekspert
04. september 2023 - 04:22 #4
Hvis vi antager at har gemt hash af password i databasen, så skal du hente den hash fra databasen og kalde verify funktionen med den.

Derfudover bør du ikke bruge mysqli_real_escape_string men parametre.

$sql = "SELECT id,passcode FROM admin WHERE username = ?";

eller noget ligende.
Avatar billede bvirk Guru
19. september 2023 - 22:16 #5
glemte ordet 'ikke' som 3.ord i #3 - så udmærket med '...gemt hash af password...' i #4.

Password konseptet kan udtrykkes let med en fil - der antages posts med meningsfulde navne.

fragment opret nyt:
$salt = uniqid();
$content = "<?php return ['".$_POST['uname']."','".crypt($_POST['password'],$salt)."','$salt'];";
file_put_contents($_SERVER['DOCUMENT_ROOT']."/config/encrypted.php",$content);

fragment lad session afspejle logged in.
[$uname,$encrypted,$salt] =include($_SERVER['DOCUMENT_ROOT']."/config/encrypted.php");
if ($uname == $_POST['uname'] && hash_equals(crypt($_POST['password'],$salt),$encrypted))
    $_SESSION['loggedin']=$_POST['uname'];
else
    $_SESSION['loggedin']='';
Avatar billede repox Seniormester
19. september 2023 - 22:30 #6
#5, ikke fordi jeg helt forstår hvad der er for noget kode du prøver at illustrere, men jeg ser du henviser til egen generering af password salt og brug med crypt() - der virker umiddelbart ikke som en fornuftig vej at gå i forhold til at bruge password_hash() og password_verify() funktionerne.
Avatar billede bvirk Guru
19. september 2023 - 22:54 #7
Jeg generer ikke password - password eksisterer ikke på server - kun det krypterde som funktion af $_POST['password'] og $_POST['uname'] fra en FORM action.
Det er blot for at illustrere princippet og i øvrigt understrege at hvis det skal være rigtigt skal salt anvendes.
https://chat.openai.com/share/812afb56-26d9-4655-a6de-906a535b2405
Avatar billede repox Seniormester
20. september 2023 - 05:11 #8
Jeg forstår simpelthen ikke hvad du skriver. Jeg italesætter at din illustration af brugen af eget genereret salt og brugen af crypt er en dårlig vej at gå, når PHP i forvejen tilbyder væsentligt bedre funktionalitet til samme formål.
Avatar billede acore Ekspert
20. september 2023 - 06:48 #9
#5:
Der spørges til hash - ikke kryptering . Det er to forskellige teknikker.  En kryptering kan (i princippet) brydes.  Det kan en hash ikke.
Avatar billede arne_v Ekspert
20. september 2023 - 16:14 #10
Det virker som om den her diskussion er ved at køre lidt af sporet.

Lad os prøve at rekapitulere lidt af det basale.

Symmetrisk kryptering:

cipher text længde N2 = encrypt(plain text længde N1, key)
plain text længde N1 = decrypt(ciper text længde N2, key)

hvor N1 kan være 0..uendenlig og N2>=N1.

En god kryptering er en kryptering hvor det er praktisk umuligt at dekryptere uden at kende key på forhånd(praktisk umuligt betyder at bedste strategi er at forsøge alle keys fra en ende af og der er så mange mulige keys at det vil tage milliarder af år med milliarder af computere at komme igennem alle).

Hashing:

hash værdi længde K = hash funktion(text længde N)

hvor N kan være 0..uendelig og K er fast (typisk 128/160/256/384/512 bit).

Det er principielt umuligt at komme fra hash værdi til text, da der findes et uendeligt antal text som giver samme hash værdi.

En god hash funktion er en hash funktion hvor:
- det er praktisk umuligt at finde en text som giver en bestemt hash værdi (en text ud af de uendeligt mange som findes)
- det er praktisk umuligt at finde to text som giver samme hash værdi

Passwords:

Det er best practice ikke at gemme password eller krypteret password i systemer men i.s.f. at gemme en hash værdi af password.

Hvis ens brugerdatabase med password lækker (tabt backup bånd, hacking, insider etc.) så er det kritisk at det ikke er muligt at genskabe passwords ud fra databasen. Kryptering er ikke godt nok, da de ondsindede i mange tilfælde (hacking, insider) vil have adgang til koden der dekrypterer og dermed til key. Og selvom systemet er kompromiteret (hacking, insider) er det stadig vigtig at beskytte password, da nogle brugere vil have ignoreret gode råd og brugt samme password andre steder.

Hashing via kryptering:

En generel hash funktion er meget forskellig fra kryptering, men passwords har en relativ lille max længde (som 32 eller 64 tegn) og derfor er der et lille trick hvor man kan hashe med kryptering.

hash funktion(text = password) = encrypt(plain text = kendt værdi, key = password)

Derfor er der en del password hashing funktioner som er krypterings baseret.

IV og salt:

For at beskytte mod genkendelige kendte værdier bruger man IV (initialization vector) med block chaining for symmetrisk kryptering og salt for hashing.

cipher text længde N2 = encrypt(IV længde M concat plain text længde N1, key)
plain text længde N1 = decrypt(ciper text længde N2, key) - IV længde M

hvor M er fast og svarer til block size.

(virker kun hvis man bruger block chainging, men det gør man altid!)

hash værdi længde K = hash funktion(salt længde M concat text længde N)

For både IV og salt gælder at:
- de skal være tilfældige
- de skal være unikke per tekst/besked/password
- ikke er hemmeligt

PHP:

I gamle dage måtte man selv kode alt det her i PHP.

Men PHP 5.5 tilføjede nogle password funktioner.

Og medmindre man har en PhD i kryptografi og en solid programmeringserfaring bør man bruge dem i PHP fremfor at implementere sine egne funktioner.
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

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