Хак: "Солим" пароль
Как изветсно LS хранит пароли в очень простом виде — md5(password), обладая некоторым количеством паранойи я решил добавить к нему соль, после ниже описанных изменений пароль будет храниться в виде: sha1(salt+md5(password))
Итак, приступим.
Нам потребуется добавить в базе данных, в таблице prefix_user новое поле под названием user_password_salt VARCHAR(32)
Размер поля зависит только от вашей паранойи, и от того что вы выберете в качестве соли (об этом пожже).
Далее нам потребуются следующие файлы:
/include/function.php
Это сердце изменений, ищем здесь строки:
И заменяем их на следующее:
Функция func_getsalt() генерирует соль, я выбрал для этого микротайм, вы вольны подставить туда все что захочется, главное чтобы результат был как можно более уникальным.
/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
Ищем строку:
И заменяем ее на:
Ищем строку:
И заменяем ее на:
Вот и Все!
От себя хочу добавить что все пароли введенные до этого момента станут недействительными и их придется восстанавливать.
P.S. На перенос в Tips & Tricks не хватает кармы.
Итак, приступим.
Нам потребуется добавить в базе данных, в таблице 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 комментариев
и у каждого юзера будет собственный набор пароль-логин.
но если уж совсем параноей болеете то
можно еще круче описать )
Можно, об этом и написано в топике, все зависит от степени вашей паранойи.
лучше бы придумали как почту в самой же бд прятать чтоб спамерам воровать бд не хотелось
1. сайт который Вы сломали на инвайтах и инвайта у вас нет т.е. Вас нет в системе, если md5 то пароль любого пользователя можно поменять на свой без проблем, с солью сложнее — надо знать алгоритм.
2. Вам не надо делать себя богом Вы хотите дискредитировать конкретного человека написав что-то от его имени, если вы смените ему пароль то он забьет тревогу и сообщит администрации, а так все может пройти незамеченным.
В общем вариантов конечно больше, и соль не зря придумали умные люди, а пользоваться или нет дело лично каждого, не надо никому ну и фиг с ним.
2) Давай проверим, сколько у тебя уйдет времени, чтобы расковырять этот хеш: f9ab069595085397e165e60096884f4e