vadnica-logo
X

Upravitelj gesel (JSON Password Manager)

Poglejmo si primer, kako shraniti šifrirana gesla v JSON datoteko. Primer se bo imenoval password_manager, ki je zasnovan za shranjevanje gesel, kjer shranjujemo, dešifriramo in organiziramo svoja gesla po mapah. Poskušal bom opisati čim bolj podrobno, za dobro razumevanje.

PRIMER
REZULTAT

Program uporablja datoteko gesla.json kot bazo podatkov do gesla. Skrb za varnost je upoštevana z uporabo šifriranih gesel, ki jih je treba dešifrirati za uporabo. Vsi podatki so shranjeni v strukturi JSON, kjer je vsak vnos organiziran po mapah in vsebuje:

Modularno delovanje in dešifriranje

Funkcija copyDecryptedPassword() dešifrira geslo prek klica na decrypt_password.php datoteko in ga kopira v odložišče. Zraven poskrbi, da geslo ni javno vidno, dokler uporabnik tega ne omogoči. V zgornjem primeru vidimo tudi gumbe za mape, ki omogočajo dinamično filtriranje prikazanih gesel na podlagi mape. Vsi vnosi so šifrirani in niso vidni neposredno. Vgrajeni obrazci preprečujejo neposredno urejanje (polja so readonly). Ogledali si bomo datoteko encrypt_password.php za šifriranje gesel, ki jih vnese uporabnik, in podatke shrani v gesla.json datoteko. Glavne funkcionalnosti so, da sprejme podatke iz obrazca (metoda POST) in preveri, ali so vsi pomembni podatki prisotni (mapa, ime, uporabnik in geslo). Uporablja funkcijo encrypt_password() za šifriranje gesla. Šifrirano geslo doda skupaj z imenom in uporabniškim imenom v datoteko JSON (gesla.json), organizirano po mapah. Obravnava napake, če šifriranje ali zapis v datoteko ne uspe.

Funkcija encrypt_password(plainText, encryptionKey):

Postopek zapisa gesel: Prebere vsebino datoteke gesla.json in jo pretvori v PHP polja (razčleni JSON). Če datoteka še ne obstaja, ustvari prazen niz. Doda novo šifrirano geslo pod ustrezno mapo in ga shrani nazaj kot JSON v datoteko.

Varnostni vidiki: Ključ za šifriranje ($encryptionKey = "geslo") je statičen — priporočljivo je, da ga premaknete v varnostne konfiguracije in ga hranite zunaj dosega kode. Mehanizmi, kot je openssl_random_pseudo_bytes, zagotavljajo dodatno zaščito z dinamičnim inicializacijskim vektorjem (IV).

Ko uporabnik pošlje obrazec iz index.php, gre POST zahteva v encrypt_password.php, kjer skripta naredi naslednje:


$file = 'gesla.json';
$currentData = json_decode(file_get_contents($file), true) ?? [];
        

Če datoteka ne obstaja ali je prazna, bo spremenljivka $currentData postavljena na prazen array ([]).


$currentData[$mapa]['vnosi'][] = [
   'ime' => $ime,
   'uporabnik' => $uporabnik,
   'geslo' => $encryptedPassword,
];
        

Tukaj se avtomatično ustvari nova mapa v $currentData, če $mapa še ne obstaja.


if (file_put_contents($file, json_encode($currentData, JSON_PRETTY_PRINT)) === false) {
   echo "Napaka pri shranjevanju podatkov!";
}
        

Dešifriranje gesel

Datoteka decrypt_password.php je zasnovana za dešifriranje prej šifriranih gesel in vračilo podatkov uporabniku preko AJAX klica. Podrobnosti:

Funkcija decrypt_password(encryptedText, encryptionKey): Prejme Base64 kodirano besedilo in ga dekodira. Razdeli kodirano besedilo na dva dela: šifriran tekst in inicializacijski vektor (IV), ki je bil uporabljen med šifriranjem. Uporablja enak ključ za dešifriranje podatkov z AES-256-CBC metodo.

Poskrbi za pravilno obravnavo napak: napaka pri dekodiranju Base64, napačna oblika šifriranega besedila ali napaka določena s funkcijo OpenSSL.

Postopek dešifriranja: dekodira šifrirano besedilo iz podatkov Base64, izloči šifrirano geslo in IV prek razdelitve (explosion) na osnovi delilnika :: ter uporabi OpenSSL za obnovitev prvotnega gesla.

Varnostni vidiki: ključ za dešifriranje ($encryptionKey) mora biti identičen ključu v datoteki encrypt_password.php. Napake med uporabniškimi podatki ali poškodovani podatki so obravnavani s sporočili o težavah.

Odgovor uporabniku: če je dešifriranje uspešno, prejme dešifrirano geslo; če je prišlo do napake, se pošlje sporočilo z opisom napake.

Primer ujemanja procesa

Uporabnik v obrazcu vnese geslo, npr. "MojeZeloVarnoGeslo", ki ga encrypt_password.php šifrira v format:


W3dlbDk1bGlkNzF3Omx3RFRxWmt4bEF5M0hhQg==::NdDpyZwOlT4Ym2hHplDxdw==
        

Sistem vrne šifrirano vsebino, jo dešifrira z ustreznim ključem in vrne izvirno geslo:


MojeZeloVarnoGeslo
        

Ti dve datoteki zagotavljata varno shranjevanje gesel v šifrirani obliki ter dodajata osnove varnostne prakse. Oglejmo si priporočila za povečanje varnosti.

Varovanje ključa: premaknimo ključ ($encryptionKey) iz kode v zunanje varnostne konfiguracije (npr. v .env datoteko).

Komunikacija: preklopimo na HTTPS, da zavarujemo podatke med odjemalcem in strežnikom.

Privilegiranost: uporabimo uporabniške račune za ločeno shranjevanje gesel in omejimo dostop.

Osrednji krmilnik

Datoteka password_manager_postopek.php deluje kot osrednji krmilnik. Skript vključuje ustrezne komponente in izvede funkcijo, kot so dodajanje vnosa ali brisanje. Uporablja funkcijo include:

Komponenta Opis
password_manager_vnos.php vsebuje funkcijo add_entry() za dodajanje novih gesel
password_manager_izbrisi.php vsebuje logiko za brisanje specifičnih vnosov (delete_entry())

S tem pristopom je koda modularna. Datoteka preveri metodo POST in obdeluje podatke iz obrazca. Uporablja filter_input za zaščito pred nevarnimi vnosi (XSS):

Relevantna polja v obrazcu so dodaj, kjer označuje tip operacije (Dodaj ali Izbriši), ime mape ter ostala polja (ime, uporabniško ime, geslo). Na podlagi pritiska na gumb skript dinamično kliče funkcije.

Če je vrednost iz polja dodaj nastavljena na "Izbriši", se izvede funkcija delete_entry.


delete_entry($mapa, $ime);
        

Po operaciji sistem preusmeri uporabnika nazaj na glavno stran z uporabo funkcije header().

Vnosi in shranjevanje

Datoteka password_manager_vnos.php vsebuje funkcijo add_entry(). Funkcija preveri, ali datoteka gesla.json obstaja, in če ne, jo avtomatično ustvari.


if (!file_exists($file)) { file_put_contents($file, json_encode([], JSON_PRETTY_PRINT)); }
        


if (json_last_error() !== JSON_ERROR_NONE) { echo "Napaka pri dekodiranju JSON: " . json_last_error_msg(); return; }
        


$podatki[$mapa]['vnosi'][] = [
    'ime' => $ime, 
    'uporabnik' => $uporabnik, 
    'geslo' => password_hash($geslo, PASSWORD_DEFAULT)
];
        


if (file_put_contents($file, json_encode($podatki, JSON_PRETTY_PRINT)) === false) { 
    echo "Napaka pri zapisu!"; 
}   else { 
    echo "Vnos dodan.\n"; 
}
        

Brisanje vnosov

Skript omogoča brisanje določenega vnosa iz mape v gesla.json datoteki. Program preverja metodo POST in nastavljivost parametrov mapa ter ime.

Parameter Opis
mapa Ime mape, iz katere želimo brisati geslo.
ime Ime vnosa, ki ga želimo izbrisati.

Za namen diagnostike skript izpiše POST podatke z print_r znotraj pre elementa. Če so vsi podatki prisotni, pokliče funkcijo delete_entry, ki odstrani vnos in posodobi datoteko.

Za nadgradnjo razmislite o napredni avtentikaciji (prijavi/registraciji) in prehodu na bazo podatkov (MySQL, MongoDB itn.). MongoDB uporablja dokumente in zbirke (BSON). Pazite na responsive design (prilagodljivo oblikovanje), saj danes vsi uporabljamo mobilne aparate.

To je na kratko vse o upravljanju z gesli na varen način, ki omogoča organiziranost po mapah in vključuje elemente šifriranja ter dešifriranja.

Hvala za obisk! Dodajam politiko zasebnosti.

© 2024 Vse pravice pridržane.

Vam je koda pomagala? Če želite podpreti moj trud pri pripravi vodičev in vzdrževanju strani, mi lahko namenite donacijo za kavo.