Перейти к контенту

Защита хэшей паролей (для 1.3)


Рекомендуемые сообщения

Читал всякие статейки про взлом IPB

и пришёл к выводу, что чаще всего тырят хэши паролей из кукисов,

а потом их расшифровывают. Зачем - понятно :D

Если же расшифровать не получается, то этот хэш всовывают в свои кукисы.

Тоже понятно зачем ;)

 

Обладатели двоек могут частично спать спокойно - там у них соль есть в паролях :) ,

да двойной md5 - так что подобрать посложнее.

А у 1.3 хэши паролей прикрыты одинарным md5 - расшифровывай - не хочу :)

 

Решил эту ситуацию поправить :)

 

 

=============================

 

Работает на PHP 4.3. и выше

Если версия PHP младше: sha1 замените на md5

Вместо "PREFIX" можно (да и нужно) вписывать какое-либо СВОЁ слово или комбинацию ;)

 

Открываем Login.php

ищем

$std->my_setcookie("pass_hash"   , $password, 1);

и заменяем на

$std->my_setcookie("pass_hash"   , sha1("PREFIX".$password."substr($ibforums->input['IP_ADDRESS'])"), 1);

 

 

Открываем functions.php

ищем

if ($this->member['password'] == $cookie['pass_hash'])

заменяем на

if (sha1("PREFIX".$this->member['password']."substr($ibforums->input['IP_ADDRESS'])") == $cookie['pass_hash'])

 

 

Открываем Register.php

ищем

$std->my_setcookie("pass_hash"   , $member['password'], 1);

меняем на

$std->my_setcookie("pass_hash"   , sha1("PREFIX".$member['password']."substr($ibforums->input['IP_ADDRESS'])"), 1);

ищем снова и заменяем - таких строчек три. замените все.

 

ищем

$std->my_setcookie("pass_hash"   , $new_pass	  , 1);

заменяем на

$std->my_setcookie("pass_hash"   , sha1("PREFIX".$new_pass."substr($ibforums->input['IP_ADDRESS'])"), 1);

 

=================================

 

Что мы сделали?

Мы усложнили хэш пароля.

Теперь он зависит ещё и от префикса и от IP пользователя.

Использовали функцию sha1 - чтобы сделать хэш длинее,

да и вроде sha1 пока не разбирается так легко, как md5,

а может у меня паранойя просто :)

И, благодаря тому, что хэш пароля зависит от IP,

то злобный хакер даже украв и подменив кукисы,

вместо того, чтобы похозяйничать, попадёт на страницу авторизации

(потеряет сессию).

 

Что плохого:

пользователи на диал-апе будут вынуждены логиниться гораздо чаще :D

 

==================================

 

А теперь, господа корифеи,

бейте меня ногами, тыкайте носом в дыры и т.д.

Так как программёром я никогда не был (и, видимо, не буду) :)

Ссылка на комментарий
Поделиться на других сайтах

ИМХО надо сделать просто также как в двойке ?

Чем делать ту же ж только вид сбоку ?

Ссылка на комментарий
Поделиться на других сайтах

Song,

может и так, но вот на что у меня ума хватило,

то и написал :D

 

а в двойке есть привязка к IP ?

Или такая привязка не нужна?

Ссылка на комментарий
Поделиться на других сайтах

привязка к IP значит :D пользователи модемов, у которых он каждый конект разный, это наверняка оценят ;)
Ссылка на комментарий
Поделиться на других сайтах

ИМХО надо сделать просто также как в двойке ?

а как сделано в двойке?

 

не качать же мне ради этого варезный дистрибутив, чтобы выяснять.

может напишет кто? :D

Ссылка на комментарий
Поделиться на других сайтах

секрет =)

а то тут хакеров недорезанных много..

 

>> не качать же мне ради этого варезный дистрибутив, чтобы выяснять.

а он зендом закодированный, так что не выяснишь )

Ссылка на комментарий
Поделиться на других сайтах

секрет

а в ПМ не расскажешь? :D

 

а он зендом закодированный, так что не выяснишь

варезный то? это врядли ;)

Ссылка на комментарий
Поделиться на других сайтах

Господа,

а никто не подскажет,

как из этой строчки

substr($ibforums->input['IP_ADDRESS'])

срезать парочку последних символов,

а то на диал-апе слишком уж весело :D

Ссылка на комментарий
Поделиться на других сайтах

$ibforums->input['IP_ADDRESS'] = substr($ibforums->input['IP_ADDRESS'],0,strlen($ibforums->input['IP_ADDRESS']) - 2);

Ссылка на комментарий
Поделиться на других сайтах

Song, спасибо.

Mitos, твоя нелюбовь к привязке по IP понятна,

но это же в какой-то мере защищает от подмены кукисов,

так что тут стандартный конфликт "безопасность-юзабельность" :D

 

А теперь, для тех, кто страдает ещё более сильной параноей, чем я ;)

выкладывается Защита Хэшей Пароля для 1.3.

с использованием алгоритма SHA-256 :)

 

Модификация ставится поверх предыдущей.

Нижеприведённый код вставляем в

Login.php, functions.php, Register.php

почти в самый конец файлов перед строкой

?>

 

/* A PHP port of JavaScript implementation of the Secure Hash Algorithm, SHA-256
* Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
* Distributed under the BSD License
* Some bits taken from Paul Johnston's SHA-1 implementation
* Ported by Vladimir Lukianov (vladimir@lukianov.ru) 2005 
* recieved from http://lvm.converters.ru
* 
*/
function zeroFill($a, $b) 
{ 
	$z = hexdec(80000000); 
	if ($z & $a) 
	{ 
		$a >>= 1; 
		$a &= (~$z); 
		$a |= 0x40000000; 
		$a >>= ($b-1); 
	} 
	else 
	{ 
		$a >>= $b; 
	} 
	return $a; 
}

function safe_add ($x,$y) {
 $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
 $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
 return ($msw << 16) | ($lsw & 0xFFFF);
}

function S ($X, $n) {return (  zeroFill($X, $n) ) | ($X << (32 - $n));}
function R ($X, $n) {return ( zeroFill($X, $n) );}
function Ch($x, $y, $z) {return (($x & $y) ^ ((~$x) & $z));}
function Maj($x, $y, $z) {return (($x & $y) ^ ($x & $z) ^ ($y & $z));}
function Sigma0256($x) {return (S($x, 2) ^ S($x, 13) ^ S($x, 22));}
function Sigma1256($x) {return (S($x, 6) ^ S($x, 11) ^ S($x, 25));}
function Gamma0256($x) {return (S($x, 7) ^ S($x, 18) ^ R($x, 3));}
function Gamma1256($x) {return (S($x, 17) ^ S($x, 19) ^ R($x, 10));}

function core_sha256 ($m, $l) {
$K = Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4
,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x
9
BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A748
4
AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,
0
xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650
A
7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A
3
,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x
3
4B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C8
7
814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);

$HASH = Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);

$W = array_fill(0,64,0);
$a=0;$b=0;$c=0;$d=0;$e=0;$f=0;$g=0;$h=0;$i=0;$j=0;
$T1=0;$T2=0;
/* append padding */
$m[$l >> 5] |= 0x80 << (24 - $l % 32);
$m[(($l + 64 >> 9) << 4) + 15] = $l;
for ( $i = 0; $i<count($m); $i+=16 ) {
	$a = $HASH[0]; $b = $HASH[1]; $c = $HASH[2]; $d = $HASH[3]; $e = $HASH[4]; $f = $HASH[5]; $g = $HASH[6]; $h = $HASH[7];

	for ( $j = 0; $j<64; $j++) {
		if ($j < 16) $W[$j] = $m[$j + $i];
		else $W[$j] = safe_add(safe_add(safe_add(Gamma1256($W[$j - 2]), $W[$j - 7]), Gamma0256($W[$j - 15])), $W[$j - 16]);

		$T1 = safe_add(safe_add(safe_add(safe_add($h, Sigma1256($e)), Ch($e, $f, $g)), $K[$j]), $W[$j]);

		$T2 = safe_add(Sigma0256($a), Maj($a, $b, $c));
		$h = $g; $g = $f; $f = $e; $e = safe_add($d, $T1); $d = $c; $c = $b; $b = $a; $a = safe_add($T1, $T2);

	}
	$HASH[0] = safe_add($a, $HASH[0]); $HASH[1] = safe_add($b, $HASH[1]); $HASH[2] = safe_add($c, $HASH[2]); $HASH[3] = safe_add($d, $HASH[3]); $HASH[4] = safe_add($e, $HASH[4]); $HASH[5] = safe_add($f, $HASH[5]); $HASH[6] = safe_add($g, $HASH[6]); $HASH[7] = safe_add($h, $HASH[7]);

}
return $HASH;
}
function str2binb ($str, $chrsz) {

 $bin = array_fill(0, ((strlen($str)*$chrsz + 64 >> 9) << 4) + 16 ,0);
 $mask = (1 << $chrsz) - 1;
 for($i = 0; $i < strlen($str)* $chrsz; $i += $chrsz){
  $charCode = ord($str[$i / $chrsz]);
$bin[$i>>5] |= ($charCode & $mask) << (24 - $i%32);
 }
 return $bin;
}

function binb2hex ($binarray) {
 $hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
 $hex_tab = $hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
 $str = "";
 for ($i = 0; $i < count($binarray)* 4; $i++) {
$str .= $hex_tab[($binarray[$i>>2] >> ((3 - $i%4)*8+4)) & 0xF].$hex_tab[($binarray[$i>>2] >> ((3 - $i%4)*8  )) & 0xF];

 }
 return $str;
}

function hex_sha256($s){
$chrsz = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode  */
return binb2hex(core_sha256(str2binb($s, $chrsz),strlen($s) * $chrsz));
}

 

И затем,

в файлах Login.php, functions.php, Register.php

меняем все sha1 на hex_sha256.

 

===============================

 

Хоть это и шутка :) но шутка работоспобная,

да и может кому имплементация sha-256 на PHP пригодится.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 год спустя...

Вот скажите мне пожалуйста. Первый, второй способ лучше применить, или оба?

 

И в чем заключается защита. Прошу, кому не лень, объяснить мне :D

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.