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

Защита хэшей паролей (для 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

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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