Pbkdf2 cudni znakovi

pozdrav,

napravio sam register skriptu za unity 3d, tako da se regam u unity 3d pa podaci udju u bazu
i sve uredno, uspjesno se regam i podaci budu u bazi ali sa lozinkom nesto ne valja

problem je kad upisem neku lozinku npr: 12345 znak bude cudan… ovakav : '`Îm
„ø²Î›¿“³þ¿â<ª¬1„àÜà,ŒÉ,Þáa&š©•Û€Ð´bóË!Ÿ1g
a kada ostavim praznu sifru kod registriranja dobijem ovo npr
569b6d3720dbe13c1aa20a163ac661064b2d0f3bc9a6f4b8d0…

stvarno ne znam u cemu je problem, guglo sam ali nisam mogo naci

evo cod :smile:

<?php define("PBKDF2_HASH_ALGORITHM", "sha256"); define("PBKDF2_ITERATIONS", 10000); define("PBKDF2_SALT_BYTE_SIZE", 128); define("PBKDF2_HASH_BYTE_SIZE", 24); define("HASH_SECTIONS", 4); define("HASH_ALGORITHM_INDEX", 0); define("HASH_ITERATION_INDEX", 1); define("HASH_SALT_INDEX", 2); define("HASH_PBKDF2_INDEX", 3); $host = "localhost"; $user = "root"; $lozinka = ""; $baza = "www404"; $bazaerror = "Ne mogu se spojiti direkt na bazu"; $hashedinput = hash('sha256', $password); $salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); $conn = mysqli_connect($host, $user, $lozinka); mysqli_select_db($conn, $baza) or die ($bazaerror); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $password = pbkdf2 ('sha256', $hashedinput, $salt, 10000, 64, @mysqli_real_escape_string($conn,$_REQUEST["password"])); $email = @mysqli_real_escape_string($conn,$_REQUEST["email"]); $check = mysqli_query($conn, "SELECT * FROM korisnici WHERE email = '".$email."'"); $usercheck = mysqli_num_rows($check); if($usercheck == 0){ $d = 'INSERT INTO korisnici (email,password) VALUES ("'.$email.'", "'.$password.'")'; mysqli_query($conn,$d) or die (mysqli_error($conn)); if($d) die("success"); }else{ die("postoji"); } //algoritam function create_hash($password) { // format: algorithm:iterations:salt:hash $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTE_SIZE, MCRYPT_DEV_URANDOM)); return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" . $salt . ":" . base64_encode(pbkdf2( PBKDF2_HASH_ALGORITHM, $password, $salt, PBKDF2_ITERATIONS, PBKDF2_HASH_BYTE_SIZE, true )); } function validate_password($password, $correct_hash) { $params = explode(":", $correct_hash); if(count($params) < HASH_SECTIONS) return false; $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]); return slow_equals( $pbkdf2, pbkdf2( $params[HASH_ALGORITHM_INDEX], $password, $params[HASH_SALT_INDEX], (int)$params[HASH_ITERATION_INDEX], strlen($pbkdf2), true ) ); } // Compares two strings $a and $b in length-constant time. function slow_equals($a, $b) { $diff = strlen($a) ^ strlen($b); for($i = 0; $i < strlen($a) && $i < strlen($b); $i++) { $diff |= ord($a[$i]) ^ ord($b[$i]); } return $diff === 0; } function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false) { $algorithm = strtolower($algorithm); if(!in_array($algorithm, hash_algos(), true)) trigger_error('PBKDF2 ERROR: Invalid hash algorithm.', E_USER_ERROR); if($count <= 0 || $key_length <= 0) trigger_error('PBKDF2 ERROR: Invalid parameters.', E_USER_ERROR); if (function_exists("hash_pbkdf2")) { // The output length is in NIBBLES (4-bits) if $raw_output is false! if (!$raw_output) { $key_length = $key_length * 2; } return hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output); } $hash_length = strlen(hash($algorithm, "", true)); $block_count = ceil($key_length / $hash_length); $output = ""; for($i = 1; $i <= $block_count; $i++) { // $i encoded as 4 bytes, big endian. $last = $salt . pack("N", $i); // first iteration $last = $xorsum = hash_hmac($algorithm, $last, $password, true); // perform the other $count - 1 iterations for ($j = 1; $j < $count; $j++) { $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); } $output .= $xorsum; } if($raw_output) return substr($output, 0, $key_length); else return bin2hex(substr($output, 0, $key_length)); } mysqli_close($conn); ?>

A koji dio tu smatras problemom? Ta skripta koju si od negdje kopirao sluzi tome da se pass ne spremi u bazu u plain text obliku, nego da se kriptira. String kojeg dobijes i kod praznog unosa sifre je nastao od salt stringa. Sto si tocno ocekivao da ce se dogodit?

Jedino pitanje na koji ti je bitan odgovor je - radi li validate_password() funkcija. Dakle, ako si se registrirao sa sifrom “1234”, mozes li se i logirati sa tom sifrom.

aha, ne mogu se logirati sa tom sifrom onda, sta da radim

Prvo sta mi pada u oci je da na $raw_output boolean saljes escapeanu pass varijablu. To bi samo po sebi tribalo unistit sve zivo, i zato dobijes hijeroglife. Raw postavljas u true samim stringom. Osim kad posaljes prazan pass; onda defaultani false odradi posao bez raw-a, i dobijes uvjetno receno “normalan” string u bazu.
Drugo, sta je uopce hash_pbkdf2()? Ovde nigdi nije definirana. Ili je ja ne vidim u ovom neprilagođenom kupusu od teksta.

Ustedi si puno vrimena i vrati se nazad tamo odakle si kopira skriptu i nađi sta si zbrljavio kad si je isa minjat.

ah dobro, budem vec nekako napravio
inace odtud sam kopiro https://defuse.ca/

Znaci ovo je skripta koju si kopira: https://github.com/defuse/password-hashing/blob/master/PasswordHash.php

Prvo, nista od ovoga ne diras, osim defineova, tipa broj iteracija ili duljina salta itd. Cili file kopiraj, i nemoj micat komentare, pogotovo kad trazis pomoc u debugiranju; tu su s razlogom.
Ti samo zelis koristit funkcije koje su ti potrebne, a to su create_hash() i validate_password().

Pokupis pass iz forme, provuces ga kroz create_hash, ono sto create_hash pljune vani zapises u bazu.
Prilikom logina koristis validate_password da usporedis sifru s onim sto stoji u bazi.

Da da, hvala ti :):slight_smile: