Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Поддържане на криптирани пароли в PHP и MySQL приложения
  1. Поддържане на криптирани пароли в PHP и MySQL приложения
     
Автор  plamenSm (23.04.2008 11:24)  съобщение до автора
Погледнат  1478 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (0)  абонирай се за PHP
    Страница 1 / 1

 



Когато разработвате приложения, които поддържат регистрация на потребители с име и парола, възниква въпроса как да пазите паролите надеждно защитени от нежелан достъп.

Какво означава „надеждно защитени”? Да допуснем, че вашата база данни по някаква причина за известно време стане достъпна за неоторизирани хора. Това съвсем не е толкова невероятно. Дори и да разберете бързо този факт и поправите пробива, все пак е възможно съдържанието на таблицата с регистрираните потребители вече да е копирано някъде. Освен това ако използвате хостинг, то администраторите на хостинг компанията имат достъп до вашите данни. Освен всичко друго, поддържането на пароли в явен вид има и чисто морална страна. Хората често използват за пароли имена, телефонни номера или друга информация, която меко казано не биха се радвали да стане достояние на други хора.

Какво е решението? Отговорът е малко обезсърчаващ - няма напълно сигурно решение, но все пак има практически приложимо. Една идеална система за поддържане на пароли можем да си представим като „черна кутия” с три основни функции - регистриране на двойка (потребител + парола), проверка дали има такава двойка и съответно премахване. Ние обаче ще трябва да си направим тази „кутия”. Така, че тя няма да е съвсем „черна”.

Ако поддържаме паролите надеждно криптирани, дори и някой да успее да ги извлече от базата данни, то те ще са безполезни. Принципа на такава система е следния:

  • При регистрация, паролата на потребителя се криптира еднозначно и еднопосочно. Какво означава това - еднозначно означава, че една и съща парола винаги ще се криптира по един и същ начин; еднопосочно означава, че алгоритъма не позволява обратно възстановяване на паролата, дори и да знаем как работи самия алгоритъм.
  • При проверка, въведената парола първо се криптира със същия алгоритъм и се сравнява с тази записана в базата при регистрацията. Тъй като приехме, че алгоритъма е еднозначен, то проверката ще работи правилно.
  • Премахването е тривиално действие и няма да се спираме на него.

Какъв алгоритъм да използваме? Напоследък най-често се използва индустриалния стандарт „Message-Digest Algorithm 5” или съкратено “MD5”. Това е алгоритъм за изчисляване на хеш функция, на зададен стринг , който отговаря на споменатите условия за еднозначност и еднопосочност. Всичко щеше да е наред, ако беше напълно вярно. Предполагам, че сега доста хора ще възразят възмутено, но е факт, че MD5 не гарантира еднопосочност за къси входни стрингове. Има алгоритъм, който успешно възстановява по-прости пароли, криптирани с MD5() функцията на PHP - просто потърсете и ще се уверите сами. Така, че е добре да се подсигурите допълнително - примерно двукратно MD5 криптиране или комбинация с друг алгоритъм, допълване на въведената парола с поредица от символи до надвишаване дължината на хеша (32 символа) и др. Освен това е добре, ако приложението ви е наистина критично да въведете и по-строги правила за паролите.

Може още много да се говори по този въпрос. Вие сами преценете как да пазите паролите на вашите потребители. Важно е да се знае обаче, че криптирането на паролите не предпазва приложението, а само паролите. Друг много критичен момент е пренасянето на паролата от браузъра на клиента до вашия сървър. Тук SSL се счита за достатъчно надеждна защита.

MD5 се предпочита поради факта, че е бърз, сигурен и има готова реализация на PHP.

Следва примерен код на PHP, който можете да използвате за преминаване към MD5 криптирани пароли, ако не сте го направили вече разбира се. За ваше удобство всички специфични параметри са изведени на дефиниции в началото. Просто задайте подходящи стойности и стартирайте скрипта. ВНИМАНИЕ подразбира се, нямате повтарящи се имена на потребители. В противен случай се откажете.

encrypt.php

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
define("DB_SERVER", "localhost");
define("DB_USER", "your_name");
define("DB_PASS", "your_pass");
define("DB_NAME", "your_db");
define("TBL_USERS", "users_table_name");
define("FLD_USER", "username_field_name");
define("FLD_PASS", "password_field_name");

set_magic_quotes_runtime(0);

$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());

mysql_select_db(DB_NAME, $connection) or die(mysql_error());

$q = "SELECT " . FLD_PASS . "," . FLD_USER . " FROM " . TBL_USERS . "";

$result = mysql_query($q, $connection);

$total = 0;
$enc = 0;
$doencrypt = false;

if (@ $_REQUEST["do"] == "encrypt"){
   
$doencrypt = true;
}

while ($data = mysql_fetch_array($result)) {
   
if ($doencrypt) {
       
$total++;
       
if (!encrypted($data[0])) {
           
$q = "UPDATE " . TBL_USERS . "
                  SET
" . FLD_PASS . "='" . md5($data[0]) . "'
                  WHERE
" . FLD_USER . "='" .
           
str_replace("'", "''", $data[1]) . "'";
           
mysql_query($q, $connection);
       
}
       
$enc++;
   
}
   
else {
       
$total++;
       
if (encrypted($data[0])){
           
$enc++;
       
}
    }
}

function encrypted($str) {
   
if (strlen($str) != 32){
       
return false;
   
}
   
   
for ($i = 0; $i < 32; $i++){
       
if ((ord($str[$i]) < ord('0')
            ||
ord($str[$i]) > ord('9'))
            &&
(ord($str[$i]) < ord('a')
            ||
ord($str[$i]) > ord('f'))){
           
return false;
       
}
    }
   
   
return true;
}
?>

<
html>
<
head><title>Encrypt passwords</title></head>
<
body>
Total passwords in the table - <?php echo $total; ?><br>
<?
php if($enc==$total && $total>0) { ?>
All passwords are encrypted.
<?
php } else if($total>0) { ?>
Unencrypted - <?php echo $total-$enc; ?><br><br>
Click "GO" to encrypt <?php echo $total-$enc; ?> passwords.<br>
WARNING! There will be no way to decipher the passwords.<br>
<
input type=button value="GO" onclick="window.location='encrypt.php?do=encrypt';">
<?
php } ?>
</
body>
</
html>

Сега ще са ви необходими и 2 метода - за регистриране на потребител и за проверка на паролата му:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
define("DB_SERVER", "localhost");
define("DB_USER", "your_name");
define("DB_PASS", "your_pass");
define("DB_NAME", "your_db");
define("TBL_USERS", "users_table_name");

$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS)
           
or die(mysql_error());
mysql_select_db(DB_NAME, $connection)
           
or die(mysql_error());

// Регистриране на нов потребител
function addNewUser($username, $password){
  
global $connection;
  
$password = md5($password);
  
$q = "INSERT INTO ".TBL_USERS."
         VALUES ('
$username', '$password')";
  
return mysql_query($q, $connection);
}

// Проверка (при Login)
function checkUserPass($username, $password){
  
global $connection;
     
  
$username = str_replace("'","''",$username);
  
$password = md5($password);

  
$q = "SELECT password FROM ".TBL_USERS."
         WHERE username = '
$username'";
  
$result = mysql_query($q, $connection);
  
if(!$result || (mysql_numrows($result) < 1)){
    
return false; // няма такъв потребител
  
}    
 
  
// Retrieve password from result
  
$dbarray = mysql_fetch_array($result);
  
  
// Validate that password is correct
  
if($password == $dbarray['password']){
     
return true; // Паролата е валидна
  
}
  
else{
     
return false; // Паролата е невалидна
  
}
}
?>

Дадения код е използваем в този вид, но вие вероятно ще искате да разположите функциите на други места и също вероятно вече ще имате създадена връзка с базата данни. Това е въпрос на разместване според структурата на вашето web-приложение.


Заключение:

Криптирането на паролите не защитава приложението, нито останалите конфиденциални данни, но защитава от възможността някой да се възползва от паролите, като влиза в приложението от името на различни потребители.

Постигането на 100% защита е невъзможно. Целта е да се постигне такава степен на сложност, която е достатъчна за да накара всеки хакер да се откаже.

Използвайте допълнителни защити, като блокиране за определено време на потребител, който е въвел примерно 3 поредни пъти грешна парола (затруднява опитите за налучкване). Никога не извеждайте съобщение кое точно е невалидно - името или паролата едно съобщение от вида „Невалидно име и/ или парола” е по-подходящо, тъй като не издава никаква информация.



Източник: webcheatsheet.com



   


Ключови думи: php mysql криптирани пароли web приложение защитени пароли


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008