În prezent, implementez o criptare simplă bazată pe RSA, după cum urmează în PHP (folosind openssl_public_encrypt):
// $sRawText este șirul de text de criptat.
// $sPublicKey este cheia publică stocată pe server.
openssl_public_encrypt($sRawText, $sRezultat, $sPublicKey, OPENSSL_PKCS1_OAEP_PADDING);
// $sResult este rezultatul criptat care este apoi stocat.
M-am asigurat că folosesc opțiunea de umplutură OAEP, totuși umplutura se face cu SHA1 în loc de SHA256. PHP nu are o opțiune de umplutură încorporată care acceptă SHA256. De exemplu, biblioteca de criptografie a lui Python folosește SHA256 astfel:
din cryptography.hazmat.primitive import serialization
din cryptography.hazmat.primitives import hashes
din criptografie.hazmat.primitives.padding asimetric import
ciphertext = cheie_publică.encrypt(
mesaj,
padding.OAEP(
mgf=padding.MGF1(algoritm=hashes.SHA256()),
algoritm=hashes.SHA256(),
label=Niciuna
)
)
Singurele opțiuni pentru mine pentru a obține SHA256 pe PHP sunt să folosesc o bibliotecă terță parte, cum ar fi PHPSecLib sau EasyRSA. Am întâmpinat blocaje după câteva ore în care am încercat să instalez și să folosesc oricare dintre ele în mediul meu de găzduire partajată. (Ar fi ideal dacă aș putea pune un fișier .php care avea RSA într-un singur loc.)
Datele sunt criptate într-o bază de date pe un server online, iar asta trebuie să se întâmple în PHP, astfel încât să pot introduce noi intrări atunci când utilizatorii se înscriu (folosind cheia publică). Aș dori să mă asigur că, dacă datele criptate ale bazei de date și cheia publică ajung în mâini nefaste cu acces la un nivel rezonabil de putere de calcul, datele vor rămâne private (la fel de sigure ca un atac cu forță brută). Datele aflate în mâini greșite pot fi abuzate de utilizatorii de phishing sau pot crea afirmații false frauduloase.
Stocarea pe partea clientului nu funcționează, deoarece datele sunt deja în baza de date în prezent și am nevoie de anumite câmpuri, cum ar fi informații de contact, pentru a contacta utilizatorul. În plus, cred că majoritatea clienților vor pierde datele, care sunt irecuperabile și trebuie să fie în continuare disponibile peste câțiva ani. Cu toate acestea, nu vreau să am încredere deplină în mediul serverului, așa că aș dori să minimizez suprafața de atac doar la momentele specifice în care datele sunt utilizate. Este mult mai ușor pentru mine să păstrez acea cheie privată și frază de acces offline și în siguranță, decât să încerc să securizez o bază de date dinamică care se schimbă constant și trebuie stocată redundant.
Plănuiesc să fac toată manipularea datelor criptate offline și să folosesc întotdeauna câmpurile criptate ale bazei de date pentru verificare (adică datele se potrivesc cu ceea ce a introdus utilizatorul) sau pentru a număra intrările.Unele câmpuri din baza de date nu sunt sensibile, deci nu sunt criptate, iar altele, precum parolele, sunt hashing.
Ceea ce vreau să știu este, dacă voi continua cu implementarea de umplutură SHA1, la ce fel de atacuri m-ar deschide împotriva unui adversar cu datele criptate ale bazei de date și cheia publică. Cum ar proceda ei la aceste atacuri? Umplutura SHA256 ajută la protejarea mai bună a datelor și cum?
Multumesc mult!