Проблем с пароли, които съдържат специални символи и bcrypt

vinsbg

Registered
Използвам bcrypt за хеширане на паролите. Всичко работи идеално, докато не установих, че примерно парола, която съдържа * не може да се логне с нея след регистрация.

Примерно пиша парола: asdf*

Не знам на какво може да се дължи и не знам, какво да покажа тук, но ще започна със самото запазване на паролата...
така я хеширам преди да я запиша в базата...
Код:
$hashedpassword = $user->password_hash($_POST['user_password'], PASSWORD_BCRYPT);
А това е password.php:
http://pastebin.com/JG4P0PnQ

Някакви идеи?

п.п. Полето в базата е char(120) ако има значение..
 
Всъщност се оказва, че проблема не е в специалните знаци, а генерално с всички пароли. Създавам акаунт. Слагам му парола, както винаги... записва се всичко в базата, но после не може да се логне.. Обаче ако я сменя през линка забравена парола и мога да се логна.. Двете форми са идентични и не мога да разбера защо едната работи, а другата не..
 
Ето така:
Код:
	private function get_user_hash($username){	

		try {
			$stmt = $this->_db->prepare("SELECT user_password FROM users WHERE user_username = :username AND active='Yes'");
			$stmt->execute(array('username' => $username));
			
			$row = $stmt->fetch();
			return $row['user_password'];

		} catch(PDOException $e) {
		    echo '<p class="bg-danger">'.$e->getMessage().'</p>';
		}
	}

	public function login($username,$password){

		$hashed = $this->get_user_hash($username);
		
		if($this->password_verify($password,$hashed) == 1){
		    
		    $_SESSION['loggedin'] = true;		   
		    return true;
		} 	
	}
$password e паролата, която е въведена. Пак казвам, че ако използвам забравена парола и сетна нова влизам с новата. Но ако влеза и създам юзър не мога.. а създаването и забравената парола ползват еднакви неща.. само където едното е INSERT ... a другото е UPDATE .. това е при създаване.
Код:
// инклуднати са връзката с базата и към password.php
$user_name = $_POST['user_name'];

//hash the password
$hashedpassword = $user->password_hash($_POST['user_password'], PASSWORD_BCRYPT);	

		if(!isset($error)){

				try {

					$stmt = $pdo->prepare('INSERT INTO users (user_username, user_password, user_email, user_name) VALUES (:user_username, :hashedpassword, :user_email, :user_name)');

					$stmt->execute(array(
						':user_username' => $_POST['user_username'],
						':hashedpassword' => $hashedpassword,
						':user_email' => $_POST['user_email'],
						':user_name' 	=> $user_name
					));

				} catch(PDOException $e) {
						var_dump ($e->getMessage());
						exit;
				}
		}

<div class="form-group">
<label class="control-label col-sm-2" for="password">Password:</label>
	<div class="col-sm-10"> 
		<input type="password" class="form-control" name="user_password" id="user_password" placeholder="Enter password">
	</div>
</div>
ето пример при създаване с проста парола на var_dump
string(6) "123321"
string(60) $2y$10$oHJmjlJGLr7Mi5ypklDdJ.ZQnWrt/Ab8PLSh4fI8BRcQ3LRdQl/5u"
И не мога да се логна с тази парола. Отивам на забравена парола въвеждам същата парола и се логвам без проблем.

Сигурен съм, че до преди седмица си работеше, защото имам създадени потребители с които в момента си влизам без проблем..
 
А ако сравниш записите в БД преди и след смяната на паролата? (казваш, че я сменяш със същата - да видим дали в БД нещо се обновява)
 
anonimen каза:
А ако сравниш записите в БД преди и след смяната на паролата? (казваш, че я сменяш със същата - да видим дали в БД нещо се обновява)
Oбновява се ... но хаша винаги си е различен с този тип криптиране дори на еднакви пароли.
Преди ресет на паролата
$2y$10$/B6pqEKUaneDiAnFM2EKY.SFgZD7qdMyzP7Lp/nOfKNHOI8v7Q9B2
след ресет
$2y$10$PxyIYOITDzhTHwtalmUDm.pWXznTpHIeUWcpZCe.fzmHRM07kLca2
Една и съща парола в случая 123321 ... след ресет влизам нормално в акаунта.
 
Начинът, по който записваш паролата при ресет и регистрация абсолютно един и същи ли е?
Например ако ползваш за salt някаква стойност, която не е зададена при регистрация, и се записва погрешно, а след това при ресет тази стойност вече е зададена?
 
Един и същи е и в двата случая.. ползва този файл -> http://pastebin.com/JG4P0PnQ

Сега си направих един експеримент исъртвам без парола и веднага след това ъпдейтвам с паролата .. не проработи.
Код:
						try {
						$hashedpassword = $user->password_hash($_POST['user_password'], PASSWORD_BCRYPT);
						var_dump($hashedpassword);
							//insert into database with a prepared statement
							$stmt = $pdo->prepare('INSERT INTO users (user_username, user_email, user_name, user_role) VALUES (:user_username, :user_email, :user_name, :user_role)');

							$stmt->execute(array(
								':user_username' => $_POST['user_username'],
								':user_email' => $_POST['user_email'],
								':user_name' 	=> $user_name,
								':user_role'	=> $user_role
							));
							$insert_id = $pdo->lastInsertId();
							
							$stmt1 = $pdo->prepare("UPDATE users SET user_password = :hashedpassword WHERE user_id = :user_id");
							$stmt1->execute(array(
								':hashedpassword' => $hashedpassword,
								':user_id' => $insert_id
							));
						//else catch the exception and show the error.
						} catch(PDOException $e) {
							var_dump ($e->getMessage());
							exit;
						}
записа си някакъв хаш, но не можах да се логна.. нищо не ми идва на акъла от къде може да е проблема и как при ресет работи, а при регистрация не иска,...
 
При регистрация да не я минаваш през trim etc и затова да не работи?

Пробвай дали няма грешка в класа за пароли, хеширай я и веднага след това я провери, без insert в БД.
 
lam3r4370 каза:
При регистрация да не я минаваш през trim etc и затова да не работи?

Пробвай дали няма грешка в класа за пароли, хеширай я и веднага след това я провери, без insert в БД.
Не няма грешка и не я тримвам. Изкарва си хеша преди да я вкарам в БД..
или не съм те разбрал?
 
lam3r4370 каза:
Пробвай да видиш дали е валиден хеша с паролата, която въвеждаш
Как мога да го пробвам това? Той хеша всеки път е различен...
 
Какво ти връща

Код:
$password = new Password;
$hash = $password->password_hash('asdf*', PASSWORD_BCRYPT);
echo password_verify('asdf*', $hash);
 
Ако "Той хеша всеки път е различен...", как въобще ще провериш при логин? Дефиницията на хеш е че даден input "гарантира" един и същ output.
Следователно някъде имаш разлика между двете форми/заявки/методи...
 
Прав си, но bcrypt имплементацията има вграден salt и съответно метод за проверка, виждаш, че не се сравнява с == а с
Код:
password_verify
 
lam3r4370 каза:
Какво ти връща

Код:
$password = new Password;
$hash = $password->password_hash('asdf*', PASSWORD_BCRYPT);
echo password_verify('asdf*', $hash);
Връща 1 .. което би трябвало да е true

Код:
		$password = new Password;
		$hash = $password->password_hash($_POST['user_password'], PASSWORD_BCRYPT);
		if(password_verify('asdf*',$hash) == 1){
		    
		    echo "true";
		}
и въведа asdf* в полето си връща true.. т.е. правилно си работи. Някъде другаде е проблема
 
Боже... намерих проблема :oops: :oops: :oops:
При логин проверявам дали потребителя е активиран active='Yes':
$stmt = $this->_db->prepare("SELECT user_password FROM users WHERE user_username = :username AND active='Yes'");
На формата за създаване на потребители изобщо не ъпдейтвам това поле ...не го пипам това поле и съответно остава празно в случая, защото няма дефотлна стойност
$stmt = $pdo->prepare('INSERT INTO users (user_username, user_email, user_name) VALUES :)user_username, :user_email, :user_name)');
на формата за смяна парола по дефолт съм го направил, когато ресетваш парола да го ъпдейтне на active='No' и когато паролата се смени го ъпдейтва на active='Yes'... тук:

UPDATE users SET user_password = :hashedpassword, resetComplete = 'Yes', active='Yes' WHERE resetToken = :token

Затова при смяна на парола работи, а при добавяне на потребител.. от недоглеждане.. ужас

Ще дам +1 на lam3r4370 , защото той пък ме насочи към нещо много важно в случая и проверих.. според php.net

password_verify

(PHP 5 >= 5.5.0, PHP 7)
password_verify — Verifies that a password matches a hash
ако правилно го разбирам трябва да е версия от 5.5 нагоре.. на хоста, където ще се ползва е 5.3 и е възможно да не проработи.
 

Горе