webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Bezpieczeństwo haseł

autor: Andrzej Kretowicz, ostatnia modyfikacja: 2007-02-23

szukaj: hasła bezpieczeństwo hasła bezpieczeństwo szyfrowanie szyfrowanie kryptografia kryptografia PHP PHP

Czasami jest tak, że musimy stworzyć system logowania – wtedy potrzebujemy przechować gdzieś hasło. Dobrym sposobem jest zahashowanie hasła i zapisanie w sesje, ale co jeśli musimy je także odczytać?

Na taki problem natknąłem się tworząc panel użytkownika kont shell, nie mogłem zapisać hasła w postaci hashu, bo za każdą próbą logowania (odświeżeniem strony) trzeba było podać hasło, a zapisanie go do sesji czy cookies wydawało mi się mało bezpieczne.

Wymyśliłem sposób na to: zapisywanie hasła w postaci zaszyfrowanej w sesji, a klucz potrzebny do rozszyfrowania trzymany jest w ciasteczku. W ten sposób bez połączenia tych dwóch elementów (przeglądarka i serwer) nie można odczytać hasła.

W praktyce całe rozwiązanie sprowadza się do użycia czegoś do generowania haseł (ja skorzystałem z klasy z joggera Radzia) oraz szyfrowania (użyłem klasy Rc4crypt). Napisałem do tego dwie funkcje:

<?php
include 'rc4.class.php';
include 'password.class.php';

function sp($_pass)
{
        if (empty($_COOKIE['haslo']))
        {
                $_pas = new password;
                $_key = $_pas->password(); // generowanie klucza 
                setcookie('haslo', $_key, time()+3600); // zapisanie klucz do COOKIE
                unset($_pas); // usunięcie zmiennej
        } else 
	      $_key = $_COOKIE['haslo']; // odczytanie klucza z ciasteczka

          return rc4crypt::encrypt($_key, $_pass, 1); // zaszyfrowanie
} 

function dp($_password)
{
        if (!empty($_COOKIE['haslo']))
        {
                $_key = $_COOKIE['haslo']; // pobranie klucza
                $_pass = rc4crypt::decrypt($_key, $_password, 1); // rozszyfrowanie
                return $_pass;
        } else {
                return false;
        }
}

?>

Oby skorzystać z tych funkcji wystarczy po zalogowaniu zapisać zakodowane hasło do sesji:

<?php
	$_SESSION['user'] = $_POST['user']; // username z $_POST;
	$_SESSION['password'] = sp($_POST['password']); // i hasło z $_POST
?>

Natomiast w momencie, gdy chcemy użyć tego hasła, np. do logowania się na ssh, użyjemy:

<?php
$_ssh2connection = ssh2login($_SESSION['user'], dp($_session['password']), 22);
?>

Andrzej Kretowicz

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org