@
Milan Hier zijn public en private keys voor gemaakt! Ik heb een proof of concept voor je gemaakt. Het werkt als volgt:
Tijdstip A
- user 1 registreert zich op je website
- je genereert een private key en een public key voor deze user (met openssl_pkey_new())
- je slaat de public key gewoon op zoals ie is, dus niet encrypted
- je encrypt de private key die je zojuist hebt aangemaakt met het wachtwoord van de user (met openssl_encrypt())
- de geëncrypte private key sla je op in je database
Tijdstip B
- user 2 registreert zich; dit is bijvoorbeeld een admin-user, daarmee doe je hetzelfde als met user 1 hierboven
Tijdstip C
- iemand slaat gevoelige informatie op (in mijn PoC is dat "Lennard heeft bloedgroep A") en encrypt dat met de public key van de klant
- het resultaat sla je op in de database
Tijdstip D
- user 1 (dus de klant) logt op je site in met zijn wachtwoord
- wachtwoord sla je op in $_SESSIE (je kunt ook een hash van dat wachtwoord ofzo gebruiken)
- je decrypt de private key van de user met het wachtwoord van de user
- je gebruikt de gedecrypte private key van de user om de opgeslagen hash met gevoelige informatie te decrypten
- et voila, je kunt de informatie zien
Tijdstip E
- user 2 (dus de admin) logt op je site in met zijn wachtwoord
- wachtwoord sla je op in $_SESSIE (je kunt ook een hash van dat wachtwoord ofzo gebruiken)
- je decrypt de private key van deze user (= admin) met het wachtwoord van de user
- je gebruikt de gedecrypte private key van de user om de opgeslagen hash met gevoelige informatie te decrypten
- et voila, je kunt de informatie zien
Volgens mij klopt het zo wel aardig. Check het wel even goed voor je het gebruikt, misschien zie ik iets heel obvious over het hoofd en is het zo lek als een mandje.

[COLOR= #0000BB]<?php
$klant_privkey[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC6xVTznrBu+Dml
p+w5QWuRkL+0JRRvypjWLD88qyosEBZ0isEiOgolBb7HJzfkRtZMpaG4/xSSZLa/
XWM/m+Me9oOA2GI+5E5rh6hIegZglwdWpQsd7hEKB8yZIv65Hf9Rwy8RU59AVJPU
BIfjlYxbQtokGMPJQo637Bs28egff8XlAmVYMltdwacBRYVFwxoBOGfWeXlWoC/o
gdr4acZV3LaHlGA0MJJkXQCaKk6oFdU2UdeaEhZ8nLCOEQWm8I9V4ZIrTQWrC2z1
EXC3wmxEyIr37uPXKGAWQ2LPcS3zFTUhh2CQlB8jIiKieBW2p7oqPg/UvscFkioJ
tkuPoIRLAgMBAAECggEADh77VEwMNOepnB+9GXsbwe66v8kJ6YXc1lyUD2c1kg1J
VVhkT80plTEBApexfx3n9/WR66XFjWf19TP/XADSRDYJLUWu7+hdEX45N/mZ39Wr
ZV6nH4UvXp3GV1GxBpgBBNKIDXxQDxIV9zK8f3WAHipIye/hZacVmUxNpnLVxQPI
BuS1+zNfJXeoGg31o/EA+ywgh/CHBRoZP0pGo4QJiaBWigsG/fnWvvYMI0uARrrL
JqTKpKlPjooe3FaWTO5pW3IRXItAe0n7ZdyTyNb6X05p8OBvSVDKjqPJBLCfNXlN
Y60vzKRRgjtKC5gKVeSPwPtUPktYctnZdJTx/iiKgQKBgQDbRpzcjUa4IffW8X1+
RdMQ9C4669Hs3Q4IzRxobBR85PNR+Zm9MnIg85I4iiXzgDN68u7dEf2jBwqZ0wjA
eGVIZFPw7RbgQ14baPi2leJZUWnCfTNEjeBzjQqKamCkN8c79Sfz02r7DygGl3XL
pR2Oa8UnZfm5K8bUg2g5WXfQwQKBgQDaDROZo9fvcp10bEIt22CQ0UH9LLshwRGy
ENRgN8Y5SYylRWmCC1zCTn9LOOcVjRegF3lwJjqRiThTdwSe5ajdwtN9qng5bE2M
PyswlB5sNou4CPJ7ZFlx6amzBDYaiy2WIfVU+1v4s+P7jUB/Y+YnHibM92SpGAkB
mTGS9JGMCwKBgDV8ifK6e0+a6YuCqGvOuGdgSI6Sy0gNu8ilz5IhGvZEGp4aVkfy
MCidgUNNX2iAEw6gh2dhZg8IPqu68F2SgJIh9t/D1Vqq1B+3gUN4WBgVZcjNJV5J
hUBqXPHadOxZtr2HVVGCdov67HZ/J3qfMhB1dUfg9gMXDI715sxmaHWBAoGAPelY
l1ceCK7SZiwW3k5brMK9qdT5jSv0ikqdAnTTo5Bujr6WpoXzYHhJTGJruoLFIn+H
y4APQSNlCs3QUg2DVPPseNHeMO+/VQLakIB94tvZ7/caYk6r1twxgtK/Seoal3Ys
4mQ8SPFK2jHRDlqfDpxRCAF2Y0yfwgRtPvySFuECgYB1mL99HIBOFUthQ1IfMErx
7tGa37sJx3ug3lqF9Q+OMUW377qAd4rVvaggCnSqJz3pY4kR8BrjreID8ychZt1K
XogZTC2sgcCkPW2yh599fgGyg+Ofynzl5sM05QMzPq6JfrXGgvhV1bOiFpCOJa4W
Bm8pdGVTcuSnaSCUS6OoQw==
-----END PRIVATE KEY-----[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #0000BB]$klant_pubkey[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAusVU856wbvg5pafsOUFr
kZC/tCUUb8qY1iw/PKsqLBAWdIrBIjoKJQW+xyc35EbWTKWhuP8UkmS2v11jP5vj
HvaDgNhiPuROa4eoSHoGYJcHVqULHe4RCgfMmSL+uR3/UcMvEVOfQFST1ASH45WM
W0LaJBjDyUKOt+wbNvHoH3/F5QJlWDJbXcGnAUWFRcMaAThn1nl5VqAv6IHa+GnG
Vdy2h5RgNDCSZF0AmipOqBXVNlHXmhIWfJywjhEFpvCPVeGSK00Fqwts9RFwt8Js
RMiK9+7j1yhgFkNiz3Et8xU1IYdgkJQfIyIiongVtqe6Kj4P1L7HBZIqCbZLj6CE
SwIDAQAB
-----END PUBLIC KEY-----[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #FF8000]# user voert zijn wachtwoord in[/COLOR]
[COLOR= #0000BB]$klant_wachtwoord[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]berenpak12[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #FF8000]# je encrypt de private key van de user met zijn eigen wachtwoord[/COLOR]
[COLOR= #0000BB]$klant_privkey_encrypted[/COLOR] [COLOR= #007700]=[/COLOR] openssl_encrypt[COLOR= #007700]([/COLOR][COLOR= #0000BB]$klant_privkey[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]BF-ECB[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$klant_wachtwoord[/COLOR][COLOR= #007700]);[/COLOR]
[COLOR= #FF8000]# opslaan in database:
# - $klant_privkey_encrypted
# - $klant_pubkey[/COLOR]
[COLOR= #0000BB]$admin_privkey[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC0R6TJJ6jTVK2f
tzkfaHHxsLsNb5pxv3hsjAjo/K1LRnIFzYY2HZUk895xObxjBccqPhN4GcSsLaH4
lrdBzhtQJXjLsvkUhR4kjbu/3tv9w1Wt+WSTCkrt/2f60hyRsNqM0S/+cuGGJHdH
+FXIdS2nacC7AgJV/9T/+7wmEoiIwckubJ2JZYNhZbHWPiYhe8oAljjnk0W6Y2gc
LqGkUOS8Aw/IcRnVg1R7cTxdz7+fB50kyPW4gzUjLKijEdpUGYNnibqWMheLg0oX
xhI+ListTipE1E8gi7uYzlPoTMJbm84DfgCQ+3CyLP1HKRjkuDosN5JScoFhL1bs
QqoA3nupAgMBAAECggEAWlyCszTGwU5zTFfZMO34Fu2/hCeJYTRYlwfFu4pTDiT8
J/5xJBTF2eTGfTg0Pen6fyjoN02rL6Ybxm884aX+OLjfiDJn+KoUhrvn/G8nE1Xi
TzZu++iv0AUxyB2ipj/f+68qgD5y3frPMuq9jKF3Ra+TI+kI5LQ7viceknK9rtWj
VhdWKIdC3gdvRTIiR90xA54I3psnXDH2LpcpKJzZFKtFTTYVVuQ8zEtjZVJ28Tum
YORgKvLGxd6aQtz4nGGSR8bFBJu8VP8iq5M1J+jUfL1T2Fq26s5lH6FygVGHhF7f
QG0KX0CUyJf1JsIu95dvRxNL3kGB5Iv6ommxByTUFQKBgQDj4NqbloDIMb6mq5fH
+JHceFGAmYZ+SkfODXCMr76XFVF++VjJTc0S7h+YQJb1fqR/91/EXlVf8yATgOsS
eN7FUYF+wPkeI0QbMZjrNM2aZxEAQXKUL1v57vi3+xmGVcdqpLlzGnE9M3d7cBQQ
/mMA1FHIGzBGWXT2MpFrZwptbwKBgQDKhw5IzlMImBZaIWtmhaBQXByQvc4DOZN3
c4mcqSYEycSqx7I6B//rjqxpSwYVry2R1oCuXmtC31jmk655CmaHDikdb7O124dL
7mI0AO/vQU+nJNVxLNNkQOTf/pgofGSU4Nenx00wCIzMHKZWfwvIFI1CWiFpgDZj
4uiCvwjMZwKBgCUtVfz0POZsVzJR5F1XjFRvvLxCT9Liw3w2bRpGwc1cSQNyIq4U
51QjTTxFrVs34haOgS1ERqF0xNLpwXAuEAoZFgtb6EimcEIPgWc+Ih0Cm59zDgJn
B5ZrCmDZsnxcGkCnxymkMr1NXDzjOCLdncFQ4lbHOMUBazePYHIpSWY5AoGATxxy
d/4gcTr3gD2Ntn58IOfaQK/jyV60O/TlzExGjZhDOnLHK+P0FA+nSXoE5nOHWXBw
06wOOhEEqQ0HGkD1y8u8Q8Neb6tRLlfwBGBZWRwqASBiP9NCv+aZgOXyid4NbBpo
IyG3BQxR82k9kIwQDhf5FfIfGxb6KAp6yJfW2AECgYA3nWx+Bb40YMZ6mkSU12t/
gigPc8yb6KpgjWtnm6WzkUB4ZNQn7XSeqlivAcGrIUVFfUakz957IarTJNqPWQIM
gOUiZ+vG2qrMHY7Zp2GAKcN+IijX/HYeFfPaEAKJBsdHidhFmw61YP06Kr+x12AN
wRGm85gsB153hseW44enzQ==
-----END PRIVATE KEY-----[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #0000BB]$admin_pubkey[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEekySeo01Stn7c5H2hx
8bC7DW+acb94bIwI6PytS0ZyBc2GNh2VJPPecTm8YwXHKj4TeBnErC2h+Ja3Qc4b
UCV4y7L5FIUeJI27v97b/cNVrflkkwpK7f9n+tIckbDajNEv/nLhhiR3R/hVyHUt
p2nAuwICVf/U//u8JhKIiMHJLmydiWWDYWWx1j4mIXvKAJY455NFumNoHC6hpFDk
vAMPyHEZ1YNUe3E8Xc+/nwedJMj1uIM1IyyooxHaVBmDZ4m6ljIXi4NKF8YSPi4r
LU4qRNRPIIu7mM5T6EzCW5vOA34AkPtwsiz9RykY5Lg6LDeSUnKBYS9W7EKqAN57
qQIDAQAB
-----END PUBLIC KEY-----[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #FF8000]# admin voert zijn wachtwoord in[/COLOR]
[COLOR= #0000BB]$admin_wachtwoord[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]mamaappelsap1[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #FF8000]# je encrypt de private key van de admin met zijn eigen wachtwoord[/COLOR]
[COLOR= #0000BB]$admin_privkey_encrypted[/COLOR] [COLOR= #007700]=[/COLOR] openssl_encrypt[COLOR= #007700]([/COLOR][COLOR= #0000BB]$admin_privkey[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]BF-ECB[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$admin_wachtwoord[/COLOR][COLOR= #007700]);[/COLOR]
[COLOR= #FF8000]# de string die je beveiligd wil opslaan[/COLOR]
[COLOR= #0000BB]$te_beveiligen_string[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]Lennard heeft bloedgroep A[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #FF8000]# de string encrypten om een encrypted ($encrypted) string te krijgen die je in de database kunt zetten[/COLOR]
[URL="http://www.php.net/openssl_public_encrypt"]openssl_public_encrypt[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$te_beveiligen_string[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$encrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$klant_pubkey[/COLOR][COLOR= #007700]);[/COLOR]
[COLOR= #FF8000]# opslaan in database: $encrypted
# klant wil data inzien en geeft zijn wachtwoord in:[/COLOR]
[COLOR= #0000BB]$wachtwoord[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]berenpak12[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #0000BB]$klant_privkey_decrypted[/COLOR] [COLOR= #007700]=[/COLOR] openssl_decrypt[COLOR= #007700]([/COLOR][COLOR= #0000BB]$klant_privkey_encrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]BF-ECB[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$wachtwoord[/COLOR][COLOR= #007700]);[/COLOR] [COLOR= #FF8000]# eerst weer achter de private key zien te komen[/COLOR]
[URL="http://www.php.net/openssl_private_decrypt"]openssl_private_decrypt[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$encrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$decrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$klant_privkey_decrypted[/COLOR][COLOR= #007700]);[/COLOR] [COLOR= #FF8000]# met private key kun je de encrypted string ($encrypted, staat in de database) decrypten[/COLOR]
[URL="http://www.php.net/var_dump"]var_dump[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$decrypted[/COLOR][COLOR= #007700]);[/COLOR] [COLOR= #FF8000]# string(26) "Lennard heeft bloedgroep A"
# admin wil data inzien en geeft zijn wachtwoord in:[/COLOR]
[COLOR= #0000BB]$wachtwoord[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]mamaappelsap1[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #0000BB]$klant_privkey_decrypted[/COLOR] [COLOR= #007700]=[/COLOR] openssl_decrypt[COLOR= #007700]([/COLOR][COLOR= #0000BB]$admin_privkey_encrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]BF-ECB[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$wachtwoord[/COLOR][COLOR= #007700]);[/COLOR] [COLOR= #FF8000]# eerst weer achter de private key zien te komen[/COLOR]
[URL="http://www.php.net/openssl_private_decrypt"]openssl_private_decrypt[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$encrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$decrypted[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$admin_privkey_decrypted[/COLOR][COLOR= #007700]);[/COLOR] [COLOR= #FF8000]# met private key kun je de encrypted string ($encrypted, staat in de database) decrypten[/COLOR]
[URL="http://www.php.net/var_dump"]var_dump[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$decrypted[/COLOR][COLOR= #007700]);[/COLOR] # string[COLOR= #007700]([/COLOR][COLOR= #0000BB]26[/COLOR][COLOR= #007700])[/COLOR] [COLOR= #DD0000]"Lennard heeft bloedgroep A"[/COLOR]
Op die manier kunnen zowel klant als admin de data inzien, elk alleen met hun eigen wachtwoord. Wanneer de server wordt gehackt en de wachtwoorden veilig zijn opgeslagen kan de hacker alleen maar de encrypted data zien. In bovenstaand geval is dat dit:
string(256) "!|nG&2vmFg)7 m8$j5EB[sTdg {F.&r;C9ixx4t"{r+T2n= d.*!vQ-nK,U[R:YN8{fJ_!`DulDjzO]+OR4I+~W "
en daar heb je dus niets aan als hacker.

Lijkt nu ingewikkeld, maar als je er een mooie class voor schrijft dan valt het best wel mee. Lastigste is om even goed te checken of het daadwerkelijk veilig is zo.
toevoeging op donderdag 1 februari 2018, 23:30:45:update:
Wat je zoekt heet asymmetric encryption; zie bijv.
hier voor hetzelfde idee en
hier voor (diep) theoretische uitleg.
toevoeging op donderdag 1 februari 2018, 23:33:59:update 2:
Ah, openssl_seal() over het hoofd gezien, daar werkt het beter mee. Zo te zien kunnen openssl_public_encrypt() en openssl_private_decrypt() maar met 245 bytes omgaan. Zie
hier voor een handigere opzet, het idee is hetzelfde als de mijne.