Просмотр полной версии : Хэш от кириллицы в разных кодировках?!
-=lebed=-
07.11.2008, 12:27
Вообщем возник вопрос из-за разных кодировок такого плана. Как известно хэш вычисляется от сообщения, т.е на вход подаётся набор байт на самом деле а не набор символов...
Допустим мы имеем текст пароль он в кодировке 1251 занимает 6 байт. Вычисляем MD5 хэш, получаем: 749789e4982b0c563f6729aac100a614
Далее мы имеем этот же текст пароль в кодировке UTF8, он уже займёт 12 байт пароль - показано как он выглядит в CP1251
Вычисленный хэш e242f36f4f95f12966da8fa2efd59992
Как видим хэши разные (ну это так и должно быть потому как разные байты и разное их количество) а вот пароль-то один "пароль"
Вопрос такой: от чего будет вычисляться в PHP5 MD5 хэш если на вход подаётся пасс в кириллице в кодировке UTF8?
от 12-ти? Либо перед вычисление произойдёт преобразование из UTF8 в CP1251 ? и будет посчитан хэш уже от 6 байтов?
Эта функция работает с бинарными данными, а не со строками определенных кодировок.
-=lebed=-
07.11.2008, 15:13
Эта функция работает с бинарными данными, а не со строками определенных кодировок.
Да что ты говоришь?
Функция md5 в PHP — Возвращает MD5 хэш строки
Синтаксис
string md5 (string str [, bool raw_output])
Я знаю как работает функция и даже знаю что такое "так называемые бинарные данные :D " Мне нужен ответ на мой вопрос! Ты вообще его понял?
<?php
$str = 'apple';
if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "Would you like a green or red apple?";
exit;
}
?>
Ты мне хочешь сказать, что результат не будет
зависеть от того как кодирована переменная $str?
preda1or
07.11.2008, 15:31
Насколько я знаю, может и ошибаюсь, перед тем как выполняеться md5($string),
$string->utf8 переводиться автоматом.
-=lebed=-
07.11.2008, 15:53
Насколько я знаю, может и ошибаюсь, перед тем как выполняеться md5($string),
$string->utf8 переводиться автоматом.
Вы уверены что так? Вычислите для проверки хэши от числа в HEX для UTF8 и CP1251, интересно всё же что подаётся на вход байты от 1251 или от UTF8
И БЕРИТЕ КИРИЛИЦУ! а не латиницу!
Вот так:
$STR="Опля!"
P.S. Тоже мне, сравнили лысую овцу с не постриженной... конечно хэш будет один, потому как в латинице строка в UTF8 та же самая что и в CP1251
<?php
$str = 'Опля!';
echo 'CP-1251: '.md5($str)."\n";
echo 'UTF-8: '.md5(iconv('windows-1251','utf-8',$str));
?>
- проверьте это...
Ну и...
CP-1251: 332bad7fc1f78b3558316280addda510
UTF-8: cd025bd5b1f060a279e5785b490e05d0
Так что думайте сами... иметь или не иметь... :D
Бля, в досовской походу набил по русски, вот правильно:
CP-1251: 53eb707315810a6b5093bc9a79e0fbfe
UTF-8: 42b2e98b197fd516ef29530fb37ee03f
Смотрим, что даёт PasswordsPro на Опля!
53eb707315810a6b5093bc9a79e0fbfe
Что даёт хэшкрэкинг?
53eb707315810a6b5093bc9a79e0fbfe
Что passcracking.com?
- чёт не отвечает... :(
insidepro.com?
- К сожелению не поддерживает...
preda1or
07.11.2008, 16:47
-=lebed=- зацепили вы меня этим вопросом... заинтересовали...будем думать....
preda1or
07.11.2008, 16:53
Работающие в PHP кодировки:
ISO-8859-*, EUC-JP, UTF-8
Установки php.ini
;; Установить внутреннюю кодировку по умолчанию
;; Примечание: Используйте кодировку символов, которая работает с PHP
mbstring.internal_encoding = UTF-8 ; Установить внутреннюю кодировку UTF-8
;; Установить кодировку символов по умолчанию для HTTP-ввода
;; Примечание: Скрипт не может изменить установку http_input
mbstring.http_input = pass ; Нет конвертации
mbstring.http_input = auto ; Установить HTTP-ввод в auto
; "auto" расширяется до "ASCII,JIS,UTF-8,EUC-JP,SJIS"
mbstring.http_input = SJIS ; Установить HTTP2-ввод в SJIS
mbstring.http_input = UTF-8,SJIS,EUC-JP ; Специфицировать порядок
;; Установить кодировку символов по умолчанию для HTTP-вывода
mbstring.http_output = pass ; Нет конвертации
mbstring.http_output = UTF-8 ; Установить кодировку HTTP-вывода в UTF-8
;; Установить порядок определения кодировки символов по умолчанию
mbstring.detect_order = auto ; Установить порядок определения в auto
mbstring.detect_order = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Специфицировать порядок
;; Установить замещающий символ по умолчанию
mbstring.substitute_character = 12307 ; Специфицировать значение Unicode
mbstring.substitute_character = none ; Не печатать символ
mbstring.substitute_character = long ; Long-Пример: U+3000,JIS+7E7E
-=lebed=-
07.11.2008, 16:54
-=lebed=- зацепили вы меня этим вопросом... заинтересовали...будем думать....
Смотрите сами, и потом не говорите что не знали!
<?php
$str = 'Опля!';
$CP1251HEX=bin2hex($str);
$UTF8HEX=bin2hex(iconv('windows-1251','utf-8',$str));
echo 'CP-1251: '.md5($str)."<br>";
echo 'CP-1251 (hex): '.md5(pack("H*", $CP1251HEX))."<br>";
echo 'UTF-8: '.md5(iconv('windows-1251','utf-8',$str))."<br>";
echo 'UTF-8 (hex): '.md5(pack("H*", $UTF8HEX))."<br>";
echo "БИНАРНЫЕ ДАННЫЕ <b>".$CP1251HEX."</b> И <b>".$UTF8HEX."</b> НЕ РАВНЫ ДЛЯ СТРОК КИРИЛЛИЦЫ В РАЗНЫХ КОДИРОВКАХ, ПОЭТОМУ И ХЭШИ РАЗНЫЕ!<br>";
echo 'Нихрена ничего не преобразовывается на автомате (кроме латиницы, потому как коды просто совпадают)!<br>';
echo 'Тайна нерасшифровывающихся хэшей раскрыта! походу это пассы в национальных UT8 с кодировкой в два байта!<br>Вообщем PasswordsPro курит в сторонке, потому как 5-значный пароль достаточно стойкий в нац. символах в кодировке UTF8!<br>';
echo iconv('utf-8','windows-1251', 'Нерезус и Гриинбир ЛАМО!');
?>
preda1or
07.11.2008, 16:54
ничего не говорит вышестоящий мой пост?)
p.s. echo iconv('utf-8','windows-1251', 'Нерезус и Гриинбир ЛАМО!');
зачетная строчка...)
-=lebed=-
07.11.2008, 17:08
ничего не говорит вышестоящий мой пост?)
Угу, как лодочку настроишь, так она и поплывёт...
P.S. Придётся заложить ещё брут нац. символов (кириллица) в кодировке UTF8 в новом движке сервиса - ведь неизвестно как настроен php на конкретном взятом сайте!... соответсвенно хэши могут быть вычисленны от паролей как я описал в примерах выше...
preda1or
07.11.2008, 17:35
А что если перебирать по бинарным данным?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot