Skip to content
SilverPC Blog

SilverPC Blog

Tech

A bolygóméretű város: Sci-fi rémálom vagy a távoli jövőnk, ahol az egész Földet egyetlen metropolisz borítja?
  • Tech

A bolygóméretű város: Sci-fi rémálom vagy a távoli jövőnk, ahol az egész Földet egyetlen metropolisz borítja?

2025.09.27.
Brutális gyorsulás: Mennyi utat tesz meg egy autó, ha 2 másodperc alatt éri el a 100 km/órát?
  • Tech

Brutális gyorsulás: Mennyi utat tesz meg egy autó, ha 2 másodperc alatt éri el a 100 km/órát?

2025.09.27.
Az adatok mögötti struktúra: Így működik a főkomponens-elemzés a gyakorlatban
  • Tech

Az adatok mögötti struktúra: Így működik a főkomponens-elemzés a gyakorlatban

2025.09.27.
A szakzsargon útvesztőjében: Mit jelentenek a CFS, GPM, MGD mértékegységek?
  • Tech

A szakzsargon útvesztőjében: Mit jelentenek a CFS, GPM, MGD mértékegységek?

2025.09.27.
A tökéletes páros: Így hozd össze a TP-Link routert a Diginet hálózatával zökkenőmentesen
  • Tech

A tökéletes páros: Így hozd össze a TP-Link routert a Diginet hálózatával zökkenőmentesen

2025.09.27.
Tényleg megáll a tudomány? Az Epson dx 7450 és a nyomtatás színes tinta nélkül
  • Tech

Tényleg megáll a tudomány? Az Epson dx 7450 és a nyomtatás színes tinta nélkül

2025.09.27.

Express Posts List

Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci
  • Roman

Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci

2025.10.02.
Dacă ai crezut vreodată că ecosistemul Linux este limitat când vine vorba de aplicații creative, în special...
Bővebben Read more about Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci
Folie protectoare pentru LCD: Mit sau necesitate pentru ecranul tău?
  • Roman

Folie protectoare pentru LCD: Mit sau necesitate pentru ecranul tău?

2025.10.02.
Primele Tale Întrebări Kubuntu? Găsește Aici Răspunsuri la Cele Mai Comune Nelămuriri
  • Roman

Primele Tale Întrebări Kubuntu? Găsește Aici Răspunsuri la Cele Mai Comune Nelămuriri

2025.10.02.
Ghidul Suprem RAM Dual Channel: Cum Să Obții Maximum de Performanță de la Sistemul Tău
  • Roman

Ghidul Suprem RAM Dual Channel: Cum Să Obții Maximum de Performanță de la Sistemul Tău

2025.10.02.
Comanda la o tastă distanță: Cel mai eficient Shortcut Show/Hide Terminal pentru desktop-ul tău
  • Roman

Comanda la o tastă distanță: Cel mai eficient Shortcut Show/Hide Terminal pentru desktop-ul tău

2025.10.02.
Primary Menu
  • Főoldal
  • Hírek
  • Tech
  • Hardver
  • Szoftver
  • Mobil
  • Gamer
  • Játék
  • Web
  • Tudomány
  • Egyéb
  • Roman

Passwordless Login: Ghid practic de integrare a elementului de securitate FIDO2 într-o pagină PHP

2025.10.02.

Te-ai săturat de parolele uitate, de riscul de a fi spart și de complexitatea gestionării lor? Ei bine, există o soluție elegantă: passwordless login folosind standardul FIDO2. Acest ghid te va purta pas cu pas prin integrarea autentificării fără parolă într-o pagină PHP, folosind elemente de securitate moderne.

Ce este FIDO2 și de ce ar trebui să-ți pese? 🤔

FIDO2 este un set de standarde deschise pentru autentificarea mai puternică și mai ușoară pe web. Acesta include două componente principale: WebAuthn (Web Authentication) pentru browser și CTAP (Client to Authenticator Protocol) pentru comunicarea cu dispozitivele de autentificare, cum ar fi token-uri USB, telefoane sau chiar senzorii biometrici integrați în laptop-uri.

De ce e mai bun decât parolele? Simplu:

  • Securitate sporită: FIDO2 utilizează criptografie cu chei publice/private, ceea ce îl face mult mai rezistent la atacuri de tip phishing sau credential stuffing.
  • Experiență îmbunătățită pentru utilizator: Utilizatorii nu mai trebuie să-și amintească parole complicate sau să le reseteze constant.
  • Conformitate: FIDO2 ajută la respectarea standardelor de securitate moderne și a cerințelor de reglementare.

Pregătirea terenului: Cerințe preliminare 🛠️

Înainte de a începe codarea, asigură-te că ai următoarele:

  • Un server web cu PHP (versiunea 7.2 sau mai recentă este recomandată).
  • Un server HTTPS configurat (FIDO2 necesită o conexiune securizată).
  • Un editor de text sau IDE pentru scrierea codului.
  • Un element de securitate FIDO2 (token USB, telefon cu suport FIDO2 etc.).
  • O bibliotecă PHP pentru gestionarea FIDO2. Voi folosi Webauthn Framework, o bibliotecă populară și bine documentată.

Instalează Webauthn Framework folosind Composer:

composer require web-auth/webauthn-framework

Implementarea pas cu pas 🚶‍♂️

Vom împărți procesul în două părți principale: Înregistrarea unui utilizator și Autentificarea sa ulterioară.

1. Înregistrarea unui utilizator 📝

Înregistrarea presupune asocierea unui element de securitate FIDO2 cu contul unui utilizator. Iată pașii implicați:

  1. Generarea unei provocări (challenge): Serverul generează o valoare aleatorie unică, numită „challenge”, pe care o trimite clientului. Această provocare este utilizată pentru a preveni atacurile de tip replay.
  2. Trimiterea cererii de înregistrare către browser: PHP generează un array JSON cu parametrii necesari pentru crearea unui nou credential WebAuthn și îl trimite către browser.
  3. Crearea credentialului în browser: Browserul afișează o solicitare utilizatorului de a-și folosi elementul de securitate (atingere, scanare biometrică etc.). După autentificare, browserul generează un nou credential și îl trimite înapoi serverului.
  4. Verificarea credentialului pe server: Serverul verifică credentialul primit, asigurându-se că acesta corespunde provocării generate anterior și că provine de la un element de securitate valid.
  5. Salvarea credentialului: Dacă verificarea are succes, serverul salvează credentialul (cheia publică) într-o bază de date, asociat cu contul utilizatorului.
  Executare comandă în terminal Centos vs. PHP shell_exec: Când și cum să folosești fiecare metodă

Iată un exemplu de cod PHP pentru generarea provocării și pregătirea cererii de înregistrare:


<?php

use WebauthnPublicKeyCredentialCreationOptions;
use WebauthnPublicKeyCredentialRpEntity;
use WebauthnPublicKeyCredentialUserEntity;
use WebauthnAuthenticatorSelectionCriteria;
use WebauthnEnumsAuthenticatorAttachment;
use WebauthnEnumsResidentKeyRequirement;
use WebauthnEnumsUserVerificationRequirement;

session_start();

// Informații despre organizația ta
$rpName = 'Exemplu FIDO2';
$rpId = $_SERVER['SERVER_NAME']; // Domeniul site-ului tău

// Informații despre utilizator (ar trebui preluate din baza de date)
$userId = 'user123'; // Un identificator unic pentru utilizator
$userName = 'John Doe';
$userDisplayName = 'John Doe';

// Crearea entităților
$rpEntity = new PublicKeyCredentialRpEntity($rpId, $rpName);
$userEntity = new PublicKeyCredentialUserEntity($userId, $userName, $userDisplayName);

// Generarea opțiunilor de înregistrare
$publicKeyCredentialCreationOptions = PublicKeyCredentialCreationOptions::create(
    $rpEntity,
    $userEntity,
    random_bytes(32), // Provocare aleatorie
    [
        // Algoritmi acceptați
        ['type' => 'public-key', 'alg' => -7], // ES256
        ['type' => 'public-key', 'alg' => -257], // RS256
    ]
)
    ->setAuthenticatorSelection(
        new AuthenticatorSelectionCriteria(
            AuthenticatorAttachment::PLATFORM,
            true,
            ResidentKeyRequirement::RESIDENT_KEY_REQUIRED,
            UserVerificationRequirement::REQUIRED
        )
    )
    ->setTimeout(60000) // Timeout în milisecunde (1 minut)
    ->jsonSerialize();

$_SESSION['registration_options'] = $publicKeyCredentialCreationOptions;

echo json_encode($publicKeyCredentialCreationOptions);

?>

Apoi, vei avea nevoie de cod JavaScript pe frontend pentru a interacționa cu API-ul WebAuthn din browser și a trimite cererea către elementul de securitate al utilizatorului. Acest cod arată cam așa:


async function register() {
  try {
    const response = await fetch('/register.php');
    const options = await response.json();

    const credential = await navigator.credentials.create({
      publicKey: options
    });

    const attestationResponse = {
      id: credential.id,
      rawId: Array.from(new Uint8Array(credential.rawId)),
      type: credential.type,
      response: {
        attestationObject: Array.from(new Uint8Array(credential.response.attestationObject)),
        clientDataJSON: Array.from(new Uint8Array(credential.response.clientDataJSON)),
        authenticatorData: credential.response.authenticatorData ? Array.from(new Uint8Array(credential.response.authenticatorData)) : null,
        signature: credential.response.signature ? Array.from(new Uint8Array(credential.response.signature)) : null,
        userHandle: credential.response.userHandle ? Array.from(new Uint8Array(credential.response.userHandle)) : null
      }
    };

    // Trimite răspunsul la server pentru verificare
    const verificationResponse = await fetch('/verify_registration.php', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(attestationResponse)
    });

    const verificationResult = await verificationResponse.json();

    if (verificationResult.success) {
      alert('Înregistrare reușită!');
    } else {
      alert('Înregistrare eșuată: ' + verificationResult.message);
    }

  } catch (error) {
    console.error('Eroare la înregistrare:', error);
    alert('Eroare la înregistrare: ' + error.message);
  }
}

În final, trebuie să verifici răspunsul pe server (verify_registration.php) și să salvezi credentialul în baza de date. Această etapă implică validarea semnăturii, verificarea că provocarea este corectă și salvarea informațiilor despre elementul de securitate.

2. Autentificarea unui utilizator 🔑

Autentificarea este procesul de a dovedi identitatea unui utilizator folosind elementul său de securitate FIDO2. Pașii sunt similari cu cei de înregistrare:

  1. Generarea unei provocări (challenge): Serverul generează o nouă provocare aleatorie și o trimite clientului.
  2. Trimiterea cererii de autentificare către browser: PHP generează un array JSON cu parametrii necesari pentru autentificare (inclusiv ID-urile credentialelor înregistrate anterior).
  3. Semnarea provocării în browser: Browserul afișează o solicitare utilizatorului de a-și folosi elementul de securitate. După autentificare, browserul semnează provocarea cu cheia privată corespunzătoare credentialului selectat și trimite semnătura înapoi serverului.
  4. Verificarea semnăturii pe server: Serverul preia cheia publică corespunzătoare credentialului utilizat și verifică semnătura primită.
  5. Autentificarea utilizatorului: Dacă verificarea semnăturii are succes, serverul autentifică utilizatorul.

Codul PHP pentru generarea provocării și pregătirea cererii de autentificare este similar cu cel de înregistrare, dar cu opțiuni diferite:


<?php

use WebauthnPublicKeyCredentialRequestOptions;
use WebauthnEnumsUserVerificationRequirement;

session_start();

// ID-urile credentialelor permise pentru acest utilizator (preluate din baza de date)
$allowedCredentials = [
  ['type' => 'public-key', 'id' => base64_decode('...credential id from database...')]
];

// Generarea opțiunilor de autentificare
$publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions::create(
    random_bytes(32) // Provocare aleatorie
)
    ->setUserVerification(UserVerificationRequirement::REQUIRED)
    ->setAllowedCredentials($allowedCredentials)
    ->setTimeout(60000) // Timeout în milisecunde (1 minut)
    ->jsonSerialize();

$_SESSION['authentication_options'] = $publicKeyCredentialRequestOptions;

echo json_encode($publicKeyCredentialRequestOptions);

?>

Codul JavaScript pentru autentificare este, de asemenea, similar cu cel de înregistrare, dar folosește funcția navigator.credentials.get():


async function authenticate() {
  try {
    const response = await fetch('/authenticate.php');
    const options = await response.json();

    const credential = await navigator.credentials.get({
      publicKey: options
    });

    const assertionResponse = {
      id: credential.id,
      rawId: Array.from(new Uint8Array(credential.rawId)),
      type: credential.type,
      response: {
        authenticatorData: Array.from(new Uint8Array(credential.response.authenticatorData)),
        clientDataJSON: Array.from(new Uint8Array(credential.response.clientDataJSON)),
        signature: Array.from(new Uint8Array(credential.response.signature)),
        userHandle: credential.response.userHandle ? Array.from(new Uint8Array(credential.response.userHandle)) : null,
      }
    };


    // Trimite răspunsul la server pentru verificare
    const verificationResponse = await fetch('/verify_authentication.php', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(assertionResponse)
    });

    const verificationResult = await verificationResponse.json();

    if (verificationResult.success) {
      alert('Autentificare reușită!');
      // Redirecționează utilizatorul către zona securizată
    } else {
      alert('Autentificare eșuată: ' + verificationResult.message);
    }

  } catch (error) {
    console.error('Eroare la autentificare:', error);
    alert('Eroare la autentificare: ' + error.message);
  }
}

Pe server (verify_authentication.php), vei verifica semnătura folosind cheia publică stocată în baza de date și, dacă este validă, vei autentifica utilizatorul.

  Nu funcționează animațiile flash? Cum instalezi Shockwave Player în Google Chrome pe Linux Mint 13

Considerații suplimentare 💡

  • Gestionarea erorilor: Implementează o gestionare robustă a erorilor pe ambele părți (client și server) pentru a oferi o experiență bună utilizatorilor.
  • Securitatea datelor: Protejează datele sensibile (cum ar fi ID-urile credentialelor) din baza de date.
  • Experiența utilizatorului: Asigură-te că procesul de înregistrare și autentificare este intuitiv și ușor de utilizat.
  • Politici de securitate: Definește politici clare privind cerințele pentru elementele de securitate FIDO2 (de exemplu, obligativitatea utilizării senzorilor biometrici).
  • Backup: Implementează mecanisme de backup pentru a permite utilizatorilor să-și recupereze accesul în cazul pierderii sau defectării elementului de securitate (de exemplu, coduri de recuperare sau alte metode de autentificare secundare).

FIDO2 nu este doar o tehnologie, este o schimbare de paradigmă în modul în care abordăm securitatea online. Prin eliminarea parolelor, reducem semnificativ suprafața de atac și oferim o experiență mai bună utilizatorilor. Cu toate acestea, este important să ne amintim că nicio soluție nu este perfectă. Implementarea corectă și continuă monitorizare sunt esențiale pentru a ne asigura că FIDO2 ne oferă cu adevărat beneficiile promise.

Concluzie 🎉

Implementarea autentificării fără parolă cu FIDO2 poate părea complexă la început, dar beneficiile pentru securitate și experiența utilizatorului sunt incontestabile. Urmând acest ghid și adaptând codul la nevoile tale, poți adăuga un nivel superior de securitate aplicațiilor tale PHP și poți oferi utilizatorilor o modalitate mai simplă și mai sigură de a se autentifica. Nu uita: testarea riguroasă și monitorizarea constantă sunt cheia succesului.

autentificare FIDO2 Passwordless login PHP Securitate securitate web WebAuthn
Partajează pe Facebook Partajează pe X Partajează pe Messenger Partajează pe WhatsApp Partajează pe Viber

Lasă un răspuns Anulează răspunsul

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Recomandate

Construiește un Formular PHP securizat și eficient: Ghid pas cu pas
  • Roman

Construiește un Formular PHP securizat și eficient: Ghid pas cu pas

2025.10.02.
Ubuntu OS: Mai mult decât o alternativă la Windows – O introducere completă pentru începători
  • Roman

Ubuntu OS: Mai mult decât o alternativă la Windows – O introducere completă pentru începători

2025.10.02.
De ce nu ar trebui să mai folosești niciodată mysql_query și ce alternative sigure ai
  • Roman

De ce nu ar trebui să mai folosești niciodată mysql_query și ce alternative sigure ai

2025.10.02.
De la zero la erou: Ghid practic pentru Docker – cum creezi un Base Image personalizat
  • Roman

De la zero la erou: Ghid practic pentru Docker – cum creezi un Base Image personalizat

2025.10.02.
Descoperă ce înseamnă în PHP operatorii și simbolurile pe care le vezi peste tot
  • Roman

Descoperă ce înseamnă în PHP operatorii și simbolurile pe care le vezi peste tot

2025.10.02.
De ce apare acel question mark in script? Rezolvarea problemelor de encodare UTF-8
  • Roman

De ce apare acel question mark in script? Rezolvarea problemelor de encodare UTF-8

2025.10.02.

Olvastad már?

Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci
  • Roman

Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci

2025.10.02.
Dacă ai crezut vreodată că ecosistemul Linux este limitat când vine vorba de aplicații creative, în special...
Bővebben Read more about Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci
Folie protectoare pentru LCD: Mit sau necesitate pentru ecranul tău?
  • Roman

Folie protectoare pentru LCD: Mit sau necesitate pentru ecranul tău?

2025.10.02.
Primele Tale Întrebări Kubuntu? Găsește Aici Răspunsuri la Cele Mai Comune Nelămuriri
  • Roman

Primele Tale Întrebări Kubuntu? Găsește Aici Răspunsuri la Cele Mai Comune Nelămuriri

2025.10.02.
Ghidul Suprem RAM Dual Channel: Cum Să Obții Maximum de Performanță de la Sistemul Tău
  • Roman

Ghidul Suprem RAM Dual Channel: Cum Să Obții Maximum de Performanță de la Sistemul Tău

2025.10.02.
Comanda la o tastă distanță: Cel mai eficient Shortcut Show/Hide Terminal pentru desktop-ul tău
  • Roman

Comanda la o tastă distanță: Cel mai eficient Shortcut Show/Hide Terminal pentru desktop-ul tău

2025.10.02.

Nu rata asta

Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci
  • Roman

Top 5 programe gratuite pentru editare video pe Linux pe care trebuie să le încerci

2025.10.02.
Folie protectoare pentru LCD: Mit sau necesitate pentru ecranul tău?
  • Roman

Folie protectoare pentru LCD: Mit sau necesitate pentru ecranul tău?

2025.10.02.
Primele Tale Întrebări Kubuntu? Găsește Aici Răspunsuri la Cele Mai Comune Nelămuriri
  • Roman

Primele Tale Întrebări Kubuntu? Găsește Aici Răspunsuri la Cele Mai Comune Nelămuriri

2025.10.02.
Ghidul Suprem RAM Dual Channel: Cum Să Obții Maximum de Performanță de la Sistemul Tău
  • Roman

Ghidul Suprem RAM Dual Channel: Cum Să Obții Maximum de Performanță de la Sistemul Tău

2025.10.02.
Copyright © 2025 SilverPC Blog | SilverPC kérdések

Az oldalon megjelenő minden cikk, kép és egyéb tartalom a SilverPC.hu tulajdonát képezi, felhasználásuk kizárólag az eredeti forrás pontos és jól látható feltüntetésével engedélyezett.