9th
FEB

В системах аутентификации само понятие пароля сводится на другой уровень абстракции

Posted by Alar under Delphi, Архив

Rouse_ 02.06.2007: Пароль – нужен только для человека, в системах аутентификации само понятие пароля сводится на другой уровень абстракции

Обзор архива темы Шифровка паролей MD5 – пароли и хеши от 01.06.2007

Пароль – нужен только для человека, в системах аутентификации само понятие пароля сводится на другой уровень абстракции, где ошибочное применение коллизионно неустойчивых алгоритмов хеширования наподобие MD ведет к большому бадабуму…

http://programmersforum.ru/showpost.php?p=22195&postcount=5

MD хэш – колизионный. Т.е. можно достаточно легко подобрать другой пароль, хэш которого совпадет с хешем оригинального пароля. Это достаточно простая математическая задача.

кол-во зашифрованных паролей для MD5 2^128 – это не показатель надежности.
Показатель, это кол-во коллизий на этот диапазон.


uses
md5, clipbrd;
procedure TForm1.FormCreate(Sender: TObject);
const
A1: array [0..127] of Byte =
($d1 ,$31 ,$dd ,$02 ,$c5 ,$e6 ,$ee ,$c4 ,$69 ,$3d ,$9a ,$06 ,$98 ,$af ,$f9 ,$5c,
$2f ,$ca ,$b5 ,$87 ,$12 ,$46 ,$7e ,$ab ,$40 ,$04 ,$58 ,$3e ,$b8 ,$fb ,$7f ,$89,
$55 ,$ad ,$34 ,$06 ,$09 ,$f4 ,$b3 ,$02 ,$83 ,$e4 ,$88 ,$83 ,$25 ,$71 ,$41 ,$5a,
$08 ,$51 ,$25 ,$e8 ,$f7 ,$cd ,$c9 ,$9f ,$d9 ,$1d ,$bd ,$f2 ,$80 ,$37 ,$3c ,$5b,
$d8 ,$82 ,$3e ,$31 ,$56 ,$34 ,$8f ,$5b ,$ae ,$6d ,$ac ,$d4 ,$36 ,$c9 ,$19 ,$c6,
$dd ,$53 ,$e2 ,$b4 ,$87 ,$da ,$03 ,$fd ,$02 ,$39 ,$63 ,$06 ,$d2 ,$48 ,$cd ,$a0,
$e9 ,$9f ,$33 ,$42 ,$0f ,$57 ,$7e ,$e8 ,$ce ,$54 ,$b6 ,$70 ,$80 ,$a8 ,$0d ,$1e,
$c6 ,$98 ,$21 ,$bc ,$b6 ,$a8 ,$83 ,$93 ,$96 ,$f9 ,$65 ,$2b ,$6f ,$f7 ,$2a ,$70);
A2: array [0..127] of Byte =
($d1 ,$31 ,$dd ,$02 ,$c5 ,$e6 ,$ee ,$c4 ,$69 ,$3d ,$9a ,$06 ,$98 ,$af ,$f9 ,$5c,
$2f ,$ca ,$b5 ,$07 ,$12 ,$46 ,$7e ,$ab ,$40 ,$04 ,$58 ,$3e ,$b8 ,$fb ,$7f ,$89,
$55 ,$ad ,$34 ,$06 ,$09 ,$f4 ,$b3 ,$02 ,$83 ,$e4 ,$88 ,$83 ,$25 ,$f1 ,$41 ,$5a,
$08 ,$51 ,$25 ,$e8 ,$f7 ,$cd ,$c9 ,$9f ,$d9 ,$1d ,$bd ,$72 ,$80 ,$37 ,$3c ,$5b,
$d8 ,$82 ,$3e ,$31 ,$56 ,$34 ,$8f ,$5b ,$ae ,$6d ,$ac ,$d4 ,$36 ,$c9 ,$19 ,$c6,
$dd ,$53 ,$e2 ,$34 ,$87 ,$da ,$03 ,$fd ,$02 ,$39 ,$63 ,$06 ,$d2 ,$48 ,$cd ,$a0,
$e9 ,$9f ,$33 ,$42 ,$0f ,$57 ,$7e ,$e8 ,$ce ,$54 ,$b6 ,$70 ,$80 ,$28 ,$0d ,$1e,
$c6 ,$98 ,$21 ,$bc ,$b6 ,$a8 ,$83 ,$93 ,$96 ,$f9 ,$65 ,$ab ,$6f ,$f7 ,$2a ,$70);
var
I: Integer;
S, Hash1, Hash2: String;
begin
//programmersforum.ru
S := '';
for I := 0 to 127 do
if A1[i] <> A2[i] then
S := Format(
'%s'#13#10'Несовпадение входных байт, порядковый номер: %d'#13#10 +
'значения: %d <> %d', [S, I, A1[i], A2[i]]);
Hash1 := MD5ToStr(MD5Calc(@A1[0], 128));
Hash2 := MD5ToStr(MD5Calc(@A2[0], 128));
S := S + sLineBreak + 'Первый контрольный хэш:' + Hash1;
S := S + sLineBreak + 'Второй контрольный хэш:' + Hash2;
if Hash1 = Hash2 then
S := S + sLineBreak + 'Хэшы совпали'
else
S := S + sLineBreak + 'Хэшы не совпали';
ShowMessage(S);
Clipboard.AsText := S;
end;

Результат работы данного кода будет следующий:

Несовпадение входных байт, порядковый номер: 19
значения: 135 <> 7
Несовпадение входных байт, порядковый номер: 45
значения: 113 <> 241
Несовпадение входных байт, порядковый номер: 59
значения: 242 <> 114
Несовпадение входных байт, порядковый номер: 83
значения: 180 <> 52
Несовпадение входных байт, порядковый номер: 109
значения: 168 <> 40
Несовпадение входных байт, порядковый номер: 123
значения: 43 <> 171
Первый контрольный хэш:79054025255FB1A26E4BC422AEF54EB 4
Второй контрольный хэш:79054025255FB1A26E4BC422AEF54EB 4
Хэшы совпали

на входе два различающихся блока данных (назовем их паролями) и хэши обоих совпадают. Достаточно будет узнать сам хэш первого пароля, чтобы за достаточно непродолжительное время подобрать его аналог (второй пароль)
Система же при вводе любого из этих паролей пропустит пользователя, не важно что во втором случае был введен не тот пароль – главное что совпал его хэш

http://programmersforum.ru/showthread.php?t=4245