php public en private key
Ik ben bezig met een klein project waarbij ik een php code moet maken waarbij de cliënt (in JavaScript) de code kan crypten met een code die de server toestuurd maar de cliënt moet de data niet kunnen decrypten met die key dat moet alleen de server kunnen met een andere key. Weet iemand hoe ik dat moet doen?
Alvast bedankt.
Gewijzigd op 02/01/2015 22:05:46 door christian k
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// password aanmaken en de hash bewaren in de database!
$password = 'bananasplit';
$hash = password_hash($password, PASSWORD_DEFAULT);
// password controleren aan de hand van de hash
$password = 'bananasplit';
if(password_verify($password, $hash)) {
echo 'Password is juist!';
} else {
echo 'Ongeldig password.';
}
?>
// password aanmaken en de hash bewaren in de database!
$password = 'bananasplit';
$hash = password_hash($password, PASSWORD_DEFAULT);
// password controleren aan de hand van de hash
$password = 'bananasplit';
if(password_verify($password, $hash)) {
echo 'Password is juist!';
} else {
echo 'Ongeldig password.';
}
?>
Leesvoer: http://php.net/manual/en/faq.passwords.php
Toevoeging op 03/01/2015 01:23:50:
In php 4 of hoger zou je zoiets als dit kunnen doen:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
define('SALT_LENGTH', 9);
function generateHash($password, $salt = null)
{
if ($salt === null)
{
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
}
else
{
$salt = substr($salt, 0, SALT_LENGTH);
}
return $salt . sha1($salt . $password);
}
function passwordVerify($password, $hash)
{
$salt = substr($hash, 0, SALT_LENGTH);
return substr($hash, SALT_LENGTH) == sha1($salt . $password);
}
// password aanmaken en de hash bewaren in de database!
$password = 'bananasplit';
$hash = generateHash($password);
// password controleren aan de hand van de hash
$password = 'bananasplit';
if(passwordVerify($password, $hash)) {
echo 'Password is juist!';
} else {
echo 'Ongeldig password.';
}
?>
define('SALT_LENGTH', 9);
function generateHash($password, $salt = null)
{
if ($salt === null)
{
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
}
else
{
$salt = substr($salt, 0, SALT_LENGTH);
}
return $salt . sha1($salt . $password);
}
function passwordVerify($password, $hash)
{
$salt = substr($hash, 0, SALT_LENGTH);
return substr($hash, SALT_LENGTH) == sha1($salt . $password);
}
// password aanmaken en de hash bewaren in de database!
$password = 'bananasplit';
$hash = generateHash($password);
// password controleren aan de hand van de hash
$password = 'bananasplit';
if(passwordVerify($password, $hash)) {
echo 'Password is juist!';
} else {
echo 'Ongeldig password.';
}
?>
Leesvoer:
http://phpsec.org/articles/2005/password-hashing.html
Gewijzigd op 03/01/2015 01:26:29 door Frank Nietbelangrijk
Maar hoe kan je nu crypten met een andere key als je decrypt?
één deel wordt ook wel de SALT genoemd. (denk aan zout dat ergens doorheen gemengd wordt)
en andere deel is het versleutelde wachtwoord.
Mis je één van beiden dan kun je het vergeten.
Als we even van het tweede voorbeeld uitgaan (want die wordt op iets oudere PHP versies ook ondersteund) dan zien we de functie generateHash. Als je deze functie gebruikt en je geeft geen salt op dan wordt er één ter plekke random gemaakt.
Maar je kunt dus ook je eigen bestaande Salt gebruiken. De functie geeft altijd een string (reeks tekens) terug die begint met de salt en daaraan gekoppeld het versleutelde wachtwoord. Dit zou je kunnen wijzigen naar een functie die niet zelf een Salt aanmaakt en dan alleen het versleutelde wachtwoord terug geeft. Op die manier hou je salt en wachtwoord gescheiden van elkaar. Voor het genereren van een salt zou je dan een aparte functie kunnen maken.
Om een wachtwoord te kunnen controleren (de functie passwordVerify) heb je ALTIJD het password EN de salt nodig.
Ik kan de functies wel wijzigen zodat het te gebruiken is zoals jij wilt maar het lijkt mij beter als je dat zelf gaat doen om de simpele reden dat je dan zeker begrijpt hoe het werkt. Ik neem aan dat je later nog even een toelichting mag geven over je werk en dan is het handig als je weet hoe het zit.
Gewijzigd op 03/01/2015 13:57:41 door Frank Nietbelangrijk
Ik moet als opdracht de werking van ssl nabouwen de client kan de string met een code crypten maar niet decrypten dat kan alleen de server. Maar hoe werkt dat dan? Ik dacht 2 keys maar dat kan dus niet.
Christian k op 03/01/2015 16:19:19:
Ik moet als opdracht de werking van ssl nabouwen de client kan de string met een code crypten maar niet decrypten dat kan alleen de server. Maar hoe werkt dat dan? Ik dacht 2 keys maar dat kan dus niet.
Dat kan alleen met API.
En hoe werkt dat precies?
Johan de wit op 03/01/2015 16:28:56:
Dat kan alleen met API.
Christian k op 03/01/2015 16:19:19:
Ik moet als opdracht de werking van ssl nabouwen de client kan de string met een code crypten maar niet decrypten dat kan alleen de server. Maar hoe werkt dat dan? Ik dacht 2 keys maar dat kan dus niet.
Dat kan alleen met API.
NABOUWEN is iets anders dan gebruiken.
En als je SSL wilt gebruiken heb je geen API nodig. Het makkelijkste is om OpenSSL te gebruiken maar deze dient dan wel op de server geïnstalleerd te zijn.
Ik heb zelf minimale ervaring met OpenSSL maar als je de zoekterm gebruikt met google komt er een flinke lading met informatie beschikbaar voor je.
Wees er van bewust dat OpenSSL nog wat ingewikkelder is dan wat ik je nu heb laten zien.
Weet je zeker dat een server de code moet kunnen decrypten? staat dat letterlijk in de opdracht?
Gewijzigd op 03/01/2015 18:49:21 door Frank Nietbelangrijk
Nee ik wil graag zelf de werking van ssl nabouwen (ik ga het niet gebruiken) maar omdat ik wel zin heb in een ingewikkelt project.
Dat kun je dan met recht zeggen. Kun je goed in C(++) programmeren? Heb je verstand van encryption? Je weet nu denk ik echt niet wat je zegt hoor :-)
Ik wist niet dat het zo ingewikkelt zou zijn. Ik dacht gwn een encryptie methode waarbij de en- en deceptie salt verschillen. Maar zo simpel is het dus niet?