Jesteś tutaj: webmade.org >> porady >> php + mysql
autor: Andrzej Kretowicz, ostatnia modyfikacja: 2007-02-23
hasła bezpieczeństwo
szyfrowanie
kryptografia
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
szukaj:
hasła bezpieczeństwo
szyfrowanie
kryptografia
PHP
Osoby czytające tę publikację przeglądały również:
blog
porady
artykuły
recenzje
wiadomości

© 2004-2008 copyright by webmade.org