Voor een puur persoonlijke website (alleen foto's uploaden, 1 gebruiker) wil ik een eenvoudig doch zo veilig mogelijk admin/inlogscript hebben.
SSL is natuurlijk de meest ideale oplossing, maar zie ik, gezien mijn huidige wens, als overkill.

Ingebouwd in PHP5.5 en hoger zit password_hash en password_verify
Is dit veilig genoeg?

Met password_hash krijg ik wel de gegevens in de database, maar het controleren met password_verify lukt me niet. De uitkomst van password_hash is, als ik het goed begrijp, elke keer anders.
Maar hoe controleer je dan met password_verify de combinatie gebruikersnaam / wachtwoord?

Bcrypt zou 'het' zijn. Lees nu echter artikels op internet om het vooral niet te gebruiken.
(o.a. http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html).
Volgens https://password-hashing.net/ zou Argon het beste / meest veilige zijn.
Is dat dan beter / veiliger ook/nog dan password_hash?
[quote}
Met password_hash krijg ik wel de gegevens in de database, maar het controleren met password_verify lukt me niet. De uitkomst van password_hash is, als ik het goed begrijp, elke keer anders.
Maar hoe controleer je dan met password_verify de combinatie gebruikersnaam / wachtwoord?
{/quote]

<?php
$hashAndSalt = password_hash($password /* $username ? */, PASSWORD_BCRYPT); // To Database

if (password_verify($password, $hashAndSalt)) {
// Ok
} else {
// Not ok
}

?>
Maar password_hash() en password_verify() helpen niet bij een onbeveiligde verbinding, want dan is de uitwisseling van gebruikersnaam en wachtwoord simpel af te tappen...

Als je te vrekkig bent voor een echt SSL-certificaat, kun je een self-signed certificaat gebruiken en dat handmatig toevoegen aan de vertrouwde certificaten. Of anders public key encryption via OpenSSL, maar dan zonder de public key te publiceren.
Ward van der Put op 03/08/2016 18:57:04

Als je te vrekkig bent voor een echt SSL-certificaat

Ik vind het jammer dat je het zo benadert.
Dacht dat die dingen honderd(en) euro's kosten. Zie dat dat mee valt, mijn hosting biedt het voor € 25 per jaar. Is daarmee nog wel duurder dan wat hosting kost.

Afgaande op jouw antwoord blijf ik de foto's wel uploaden met ftp.

@Davy: met jouw code controleer je toch niet met gegevens in de database?
@obelix,

Klopt.. Het is dan ook een voorbeeld en aangezien je al gevorderde php'er ben, kom je er vast wel uit. Probeer het dan ook eerst.
Denk je dat ik een topic start, zonder dat ik zelf niet wat heb geprobeerd? ;-)

@Obelix

Volgens mij begrijp je me verkeerd. Je vraag ging over werking van password_hash() en password_verify:


Met password_hash krijg ik wel de gegevens in de database, maar het controleren met password_verify lukt me niet. De uitkomst van password_hash is, als ik het goed begrijp, elke keer anders.
Maar hoe controleer je dan met password_verify de combinatie gebruikersnaam / wachtwoord?


En op basis daarvan gaf ik je een voorbeeld waar er "// To Database" achter $HashAndSalt staat, dus daar moet je dan zelf een code in elkaar gaan knutselen voor je database (Waarschijnlijk heb je dat al gedaan en hoef je het enkel te aanpassen), de rest van de code is hoe je ophaalt ($HashAndSalt in password_verify moet dus anders zijn en van je database komen ($passwordvanjedataabase)) en inlogt.
>> Als je te vrekkig bent voor een echt SSL-certificaat ...

Nou nou Ward, dat kan ook wat minder ;-)
Zoals TS zegt gaat het om een hobby-site.

Obelix, kun je geen gebruikmaken van Let's Encrypt? https://letsencrypt.org/

Ik heb er zelf (nog) geen ervaring mee, maar misschien is het een mooie (gratis) oplossing voor je.
Obelix en Idefix op 03/08/2016 19:34:37
Afgaande op jouw antwoord blijf ik de foto's wel uploaden met ftp.

FTP of SFTP?

Ozzie PHP op 03/08/2016 20:41:47

Zoals TS zegt gaat het om een hobby-site.

Een hobbysite kan ook worden gehackt en vervolgens worden misbruikt voor spam, phishing, file sharing, enzovoort, enzovoort.

De TS ging er ten onrechte van uit dat SSL-cerficaten "honderd(en) euro's" kosten, maar dat is niet zo. Twee #gratis alternatieven, die afdoende zijn voor een hobbysite, zijn StartSSL Free en CAcert.
Goed. Ik ga kijken naar sftp, een ssl.

Maar antwoord op mijn eigenlijke vragen heb ik nog niet gekregen.
Of is het met ssl niet meer nodig om gegevens gecodeerd op te slaan in de database?
Is er iemand die me daarbij kan en wil helpen?

in database opslaan:
<?php
	$options = array('cost' => 11);
//	echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
//	echo password_hash($_POST['pass'], PASSWORD_BCRYPT, $options)."\n";
	$pass = password_hash($_POST['pass'], PASSWORD_BCRYPT, $options)."\n";
	
	$sql_statement="INSERT INTO 
			inlog
		(
			naam,
			wachtwoord
		) 
		VALUES 
		(
			'".mysqli_real_escape_string($verbinding_database ,$_POST['user'])."' ,
			'".$pass."'
		)";
?>

Dit lijkt goed te gaan, want zie in de database inderdaad gegevens staan.

Controleren / opvragen:

<?php
	$options = array('cost' => 11);
	$pass = password_hash($_POST['pass'], PASSWORD_BCRYPT, $options)."\n";
//	echo $pass; 
	
	$sql_statement = "SELECT 
				id,
				naam,
				wachtwoord
			FROM 
				inlog
			WHERE 
				naam = '".mysqli_real_escape_string($verbinding_database ,$_POST['user'])."'
			AND	
				wachtwoord = '".$pass."'";
	$num_rows = mysqli_num_rows($result);
	echo 'rijen: '. $num_rows;
	if($num_rows >0)
	{
		echo 'query gelukt';
		$data = mysqli_fetch_assoc($result);
		echo 'id : '.$data['id'];
	}
?>

Maar $pass levert telkens een andere waarden op, zelfs met dezelfde gegevens. Hoe controleer je dan de inloggegevens die worden opgegeven met die in de database?
En is Bcrypt op dit moment nog een veilige manier van beveiligen (los van ssl, sftp, .....)?

Reageren