bcrypt (of toch niet)?
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?
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]
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.
Gewijzigd op 03/08/2016 18:57:23 door Ward van der Put
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?
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.
Gewijzigd op 03/08/2016 19:54:17 door Obelix Idefix
Volgens mij begrijp je me verkeerd. Je vraag ging over werking van password_hash() en password_verify:
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?
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.
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.
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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."'
)";
?>
$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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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'];
}
?>
$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, .....)?
Gewijzigd op 04/08/2016 07:50:26 door Obelix Idefix
Da's waar ... maar hoe helpt ssl tegen deze specifieke zaken dan?
Anyhow ... Let's Encrypt is toch ook gratis?
Toevoeging op 04/08/2016 07:53:06:
>> Of is het met ssl niet meer nodig om gegevens gecodeerd op te slaan in de database?
Jawel, dat is altijd nodig voor het geval je database wordt gehackt.
SSL beveiligt het verkeer tussen de server en je browser. In plaats van dat er dan 'wachtwoord123' wordt overgestuurd, wordt er zoiets als 'XZB_23dfd!DSsdyyyta' (ik verzin maar wat) overgestuurd zodat als iemand het signaal 'afluistert' (een zogenaamde man-in-the-middle-attack) hij het wachtwoord niet kan zien.
Gewijzigd op 04/08/2016 07:54:09 door Ozzie PHP
Quote:
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?
Gefeliciteerd! Hij doet het helemaal goed! ;)
Het is ook de bedoeling dat er een andere hash uitkomt.
Dat is nou het mooie van password_hash().
Met password_verify() controleer je of de hash goed is of niet.
Dus het eenvoudigst is, om een opzetje te maken met een paar simpele if statements:
In een notendop:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// effe voor de eenvoud
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
// simpele query uitvoeren om de gegevens uit te poepen..
if (password_verify($row['password_from_db'], $hash)) {
//echo 'Password is valid!';
// Dit is wel belangrijk...
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
// If so, create a new hash, and replace the old one
$newHash = password_hash($hash, PASSWORD_DEFAULT);
// insert into DB ...
// login verdergaan
}
} else {
echo 'Invalid password.';
// zend ze terug naar formulier of google o.i.d.
}
?>
// effe voor de eenvoud
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
// simpele query uitvoeren om de gegevens uit te poepen..
if (password_verify($row['password_from_db'], $hash)) {
//echo 'Password is valid!';
// Dit is wel belangrijk...
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
// If so, create a new hash, and replace the old one
$newHash = password_hash($hash, PASSWORD_DEFAULT);
// insert into DB ...
// login verdergaan
}
} else {
echo 'Invalid password.';
// zend ze terug naar formulier of google o.i.d.
}
?>
edit
En nu snap ik pas waar jij tegenaan loopt.
Dat had ik dus ook in het begin, jou gedachte is om een WHERE username = AND password = te willen controleren. Dat werkt dus nu niet meer. Dat hoeft dus ook niet meer.
Immers, het enige wat je doet is controleren of username of email in de database staat. Is dat zo dan kijk je of het password erbij past. Overigens, doe ik tegenwoordig geen username meer maar met email. Die is immmers uniek voor een gebruiker. Maar dat is meer een persoonlijke voorkeur.
Gewijzigd op 04/08/2016 09:26:26 door Bart V B
Bart V B op 04/08/2016 09:00:29:
Gefeliciteerd! Hij doet het helemaal goed! ;)
Het is ook de bedoeling dat er een andere hash uitkomt.
Dat is nou het mooie van password_hash().
Quote:
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?
Gefeliciteerd! Hij doet het helemaal goed! ;)
Het is ook de bedoeling dat er een andere hash uitkomt.
Dat is nou het mooie van password_hash().
Dat vermoeden had ik al.;-)
Bart V B op 04/08/2016 09:00:29:
edit
En nu snap ik pas waar jij tegenaan loopt.
Dat had ik dus ook in het begin, jou gedachte is om een WHERE username = AND password = te willen controleren. Dat werkt dus nu niet meer. Dat hoeft dus ook niet meer.
Immers, het enige wat je doet is controleren of username of email in de database staat. Is dat zo dan kijk je of het password erbij past.
En nu snap ik pas waar jij tegenaan loopt.
Dat had ik dus ook in het begin, jou gedachte is om een WHERE username = AND password = te willen controleren. Dat werkt dus nu niet meer. Dat hoeft dus ook niet meer.
Immers, het enige wat je doet is controleren of username of email in de database staat. Is dat zo dan kijk je of het password erbij past.
Dus toch. Maar dat blijf ik een vreemde gedachtegang vinden.
Hoe weet je dan of het wachtwoord klopt met wat wordt opgegeven?
Ga nog wel eens thuis proberen.
Zoals ik al zei ik gebruik tegenwoordig email en password.
Email is uniek, (of beter maakt het uniek in de db).
Je doet eigenlijk het zelfde alleen haal je eerst gegevens op en dan controleer je pas.
Er zit alleen een extra laagje/stukje in.
Het is gelukt.
Ook de anderen bedankt voor reageren.
Ga me verdiepen in de (gratis) mogelijkheden van SSL / sftp.
Dat cacert weet ik zo net nog niet:
www.cacert.org gebruikt een ongeldig beveiligingscertificaat. Het certificaat wordt niet vertrouwd, omdat het is ondertekend via een ondertekeningsalgoritme dat is uitgeschakeld omdat dat algoritme niet beveiligd is. Foutcode: SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED
Bij Let'sEncrypt kom ik op https://certbot.eff.org/
Moet daar uit twee pulldown menu's kiezen. Denk dat ik dat beter kan opvragen bij hostingbedrijf (?!)
Betwijfel of ik die installatie instructies kan/mag uitvoeren.
Gewijzigd op 05/08/2016 20:42:07 door Obelix Idefix
Dat ssl verhaal, als je een gewoon hosting pakket hebt bij een hostingboer, dan is het wat beperkter.
Als je geen commandline hebt, (VPS e.d.) dan is let's encrypt geen optie voor je.
Maar kan het helemaal mis hebben, weet niet bij wie je hosting is ondergebracht?
Heb op https://forum.antagonist.nl/viewtopic.php?f=2&t=13121&p=75929&hilit=ssl+encrypt#p75929 informatie gevonden, maar dat ziet er nog vrij complex uit. Tevens (b)lijkt dat het maar drie maanden werkt/geldig is.
Uit het topic begrijp ik ook dat er gekeken wordt/gewerkt aan een oplossing, om net als bv. Joomla te laten installeren via het controlpanel. Kan me alleen maar aansluiten bij die wens.