Хак: "Солим" пароль

Как изветсно LS хранит пароли в очень простом виде — md5(password), обладая некоторым количеством паранойи я решил добавить к нему соль, после ниже описанных изменений пароль будет храниться в виде: sha1(salt+md5(password))
Итак, приступим.

Нам потребуется добавить в базе данных, в таблице prefix_user новое поле под названием user_password_salt VARCHAR(32)
Размер поля зависит только от вашей паранойи, и от того что вы выберете в качестве соли (об этом пожже).

Далее нам потребуются следующие файлы:
/include/function.php
/classes/modules/user/mapper/User.mapper.php
/classes/modules/user/entity/User.entity.php
/classes/actions/ActionRegistration.class.php
/classes/actions/ActionSettings.class.php
/classes/actions/ActionLogin.class.php


/include/function.php

Это сердце изменений, ищем здесь строки:
function func_encrypt($sData) {
	return md5($sData);
}

И заменяем их на следующее:
function func_encrypt($sData,$sSalt = '') {
	return sha1($sSalt.md5($sData));
}

function func_getsalt()
{
	return microtime(false);
}


Функция func_getsalt() генерирует соль, я выбрал для этого микротайм, вы вольны подставить туда все что захочется, главное чтобы результат был как можно более уникальным.

/classes/modules/user/mapper/User.mapper.php

Найти строку:
user_password,

Заменить на:
user_password,
user_password_salt

Найти строку:
if ($iId=$this->oDb->query($sql,$oUser->getLogin(),$oUser->getPassword(),$oUser->getMail(),$oUser->getDateRegister(),$oUser->getIpRegister(),$oUser->getActivate(),
$oUser->getActivateKey())) {

Заменить на:
if ($iId=$this->oDb->query($sql,$oUser->getLogin(),$oUser->getPassword(),$oUser->getPasswordSalt(),$oUser->getMail(),$oUser->getDateRegister(),$oUser->getIpRegister(),$oUser->getActivate(),
$oUser->getActivateKey())) {

Найти строку:
user_password = ? ,

Заменить на:
user_password = ? ,
user_password_salt = ? ,

Найти строку:
if ($this->oDb->query($sql,$oUser->getPassword(),

Заменить на:
if ($this->oDb->query($sql,$oUser->getPassword(),
$oUser->getPasswordSalt(),


/classes/modules/user/entity/User.entity.php

Надо добавить в класс следующие две функции:
public function getPasswordSalt() {
    return $this->_aData['user_password_salt'];
}
public function setPasswordSalt($data) {
    $this->_aData['user_password_salt']=$data;
}


/classes/actions/ActionRegistration.class.php

Ищем строку:
$oUser->setPassword(func_encrypt(getRequest('password')));

И заменяем ее на:
$salt = func_getsalt();
$oUser->setPassword(func_encrypt(getRequest('password'),$salt));
$oUser->setPasswordSalt($salt);


/classes/actions/ActionSettings.class.php

Ищем строку:
$this->oUserCurrent->setPassword(func_encrypt(getRequest('password')));

И заменяем ее на:
$salt = func_getsalt();
$this->oUserCurrent->setPassword(func_encrypt(getRequest('password'), $salt));
$this->oUserCurrent->setPasswordSalt($salt);


/classes/actions/ActionLogin.class.php

Ищем строку:
if ($oUser->getPassword()==func_encrypt(getRequest('password')) and $oUser->getActivate()) {

И заменяем ее на:
if ($oUser->getPassword()==func_encrypt(getRequest('password'), $oUser->getPasswordSalt()) and $oUser->getActivate()) {


Ищем строку:
$oUser->setPassword(func_encrypt($sNewPassword));

И заменяем ее на:
$salt = func_getsalt();
$oUser->setPassword(func_encrypt($sNewPassword, $salt));
$oUser->setPasswordSalt($salt);


Вот и Все!
От себя хочу добавить что все пароли введенные до этого момента станут недействительными и их придется восстанавливать.

P.S. На перенос в Tips & Tricks не хватает кармы.

10 комментариев

avatar
Оценяйте люди первую пробу в LS. Если совсем фуфло написал так может ну его.
  • Vass
  • 0
avatar
можно было тупо сделать
$oUser->setPassword(md5(__Пароль__ . __Логин__));

и у каждого юзера будет собственный набор пароль-логин.

но если уж совсем параноей болеете то
function func_getsalt()
{
        return microtime(false);
}


можно еще круче описать )
function func_getsalt()
{
        return uniqud(microtime(true), true);
}
avatar
Тупо сделать нельзя, потому как логини всем известен, толку то от того что вы его туда приписали?
можно еще круче описать )
Можно, об этом и написано в топике, все зависит от степени вашей паранойи.
avatar
толк от того что это уже не стандартный md5 и уже задуматься стоит об генерации хеша пароля. в любом случае если есть доступ к бд, мне не нужны будут ваши хеши паролей
avatar
Смотря какой доступ к базе, если только на чтение, то захешированные с солью пароли не поддадутся поиску по базам хешей, а только тупым прямым перебором.
avatar
А смысл всей этой возни? Если пароль сам по себе очень простой, то никакое шифрование его не спасет.
avatar
ну тут чисто в случае несанкц. доступа к бд. хотя если я получил доступ к бд мне нах не нужен пароль будет. я его поменяю на свой в этой же системе и пропишу себя богом.

лучше бы придумали как почту в самой же бд прятать чтоб спамерам воровать бд не хотелось
avatar
Ну пару примеров:
1. сайт который Вы сломали на инвайтах и инвайта у вас нет т.е. Вас нет в системе, если md5 то пароль любого пользователя можно поменять на свой без проблем, с солью сложнее — надо знать алгоритм.
2. Вам не надо делать себя богом Вы хотите дискредитировать конкретного человека написав что-то от его имени, если вы смените ему пароль то он забьет тревогу и сообщит администрации, а так все может пройти незамеченным.

В общем вариантов конечно больше, и соль не зря придумали умные люди, а пользоваться или нет дело лично каждого, не надо никому ну и фиг с ним.
avatar
Дело именно в доступе к БД, md5 давно не безопасен, т.к. его уже расковыряли.
avatar
1) Выше уже было сказано, что если я получу доступ к бд, то пароли мне нафиг не нужны
2) Давай проверим, сколько у тебя уйдет времени, чтобы расковырять этот хеш: f9ab069595085397e165e60096884f4e
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.