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.
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:
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!";
}
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.
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.
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().
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";
}
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.