Расшифровка Пароля
1 replies1,694 viewsCurrently viewing: 1
· 01/03/2009, 06:34 PM
Ввиду того, что на форуме очень часто стали появляться вопросы "Как расшифровать" пароль, я пишу пояснение.
Почему я сделал все так длинно?
Ну потому что уже достали конкретно, разжевываю для самых тупых наверное
Схема получения "шифрованного" пароля:
Исходный пароль -> UTF-8 -> SHA-1 -> Raw(Перевод в бинарную строку) -> Base64 := Помещение результата в базу.
Пояснения к терминам:
- SHA-1 - один, из многочисленных методов получения "контрольной суммы" или "отпечатка" от исходных данных.
Контрольные суммы НЕ относятся к семейству шифровалок, поэтому данные на выходе не содержат никакого пароля. Просто - его отпечаток.
Как например ваша подпись на документе.
В подписи нет вашего имени и отчества, и например без правильной подписи вам откажут в банке даже при наличии имени и отчества.
Это как отдаленный, но сопоставимый пример, смысл надеюсь понятен. - RAW - В переводе означает "сырой". Подробно раскладывать не буду, скажу коротко: преобразование в Бинарную строку.
- Base64 - Транспортное кодирование, и вовсе не шифрование. (Уже исходный вид пароля).
В данном случае используется исключительно для удобства хранения "бинарной строки" в базе данных.
Легко декодируется и кодируется, как два пальца.
Ответ на вопрос "а как некоторые все-таки получают пароль":
В этом случае эти "некоторые" применяют брут(brute) или в народе "перебор паролей".
Специальные и самописные программы которые по заданному алгоритму подбирают пароли, и воссоздают его по схеме указанной вверху.
Если отпечаток сгенерированного пароля, совпадает с требуемым отпечатком - цель достигнута.
Есть программы которые используют как ЦПУ, так и ГПУ(видеокарта)...что позволяет достичь перебора ~1миллиона паролей в секунду.
Хотя все зависит от алгоритма и стойкости пароля.
Например крепкий пароль из 20 символов и больше можно подбирать неделю, месяц, год...может и больше.
Но эту тему обсуждать мы не будем, ибо тут хакерством мы не промышляем.
—————————————————————————————————————————————————————————————
Интересные факты:
- В базе логин-сервера НЕТ паролей, только их отпечатки.
- Применяется алг.SHA-1, а не MD5 как некоторые "опытные головы" любят всем говорить.
- Base64 не является методом шифрования данных.
- SHA-1,MD5 и прочие так-же - не являются методом шифрования данных.
- Не существует программ на "расшифровки", возможно вы путаете их с программами подбора (брут).
- Утверждение "раз зашифровали, можно и расшифровать" в данном случае не уместно.
Поговорим еще (для безнадежных и упрямых):
Если вы настолько уверены, что из отпечатка SHA-1 можно восстановить оригинальный пароль - вот вам задача.
Вы видели когда-нибудь число CRC32 пользуясь архиваторами типа Winrar?

Вот...мы имеем отпечаток(контрольную сумму) 8F3E13F1, и файл на 700 киллобайт.
Давайте закодируем наш отпечаток в base64 и мы получаем OEYzRTEzRjE=
После этого удаляем файл весом 700кбайт и теперь у вас задача:
Восстановить содержимое файла в полном объеме имея в наличии 12байт (закодированная контрольная сумма).
Если справитесь - свистните мне. Награда обеспечена!
—————————————————————————————————————————————————
Как сервер при входе проверяет пароль?:
Я полагаю, что вы думаете что при входе сервер расшифровывает пароль и значит способ есть.
Нет, вы ошибаетесь.
Посмотрите на схему в начале темы, таким образом при регистрации мы получаем пароль и он хранится в базе.
При входе, на логин сервер приходит оригинальный и голый пароль.
Затем этот оригинальный пароль на стороне логин-сервера шифруется по схеме выше образовывая бинарную(raw) строку. (Без применения base64).
Затем из базы достается сохраненная ранее base64 строка, декодируется получая raw значение, и если обе идентичны - пароль валидный.
Кусок исходного кода логин-сервера:
Код
..............
MessageDigest md = MessageDigest.getInstance("SHA");
byte[] raw = password.getBytes("UTF-8"); <<<<<<-------------------
byte[] hash = md.digest(raw); <<<<<<-------------------
byte[] expected = null;
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT password, accessLevel, lastServer FROM accounts WHERE login=?"); <<<<<<-------------------
statement.setString(1, user);
ResultSet rset = statement.executeQuery();
if (rset.next())
{
expected = Base64.decode(rset.getString("password")); <<<<<<-------------------
..............
MessageDigest md = MessageDigest.getInstance("SHA");
byte[] raw = password.getBytes("UTF-8"); <<<<<<-------------------
byte[] hash = md.digest(raw); <<<<<<-------------------
byte[] expected = null;
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT password, accessLevel, lastServer FROM accounts WHERE login=?"); <<<<<<-------------------
statement.setString(1, user);
ResultSet rset = statement.executeQuery();
if (rset.next())
{
expected = Base64.decode(rset.getString("password")); <<<<<<-------------------
..............
Полный исходник тут: http://www.l2jserver.com/svn/trunk/L2_Game...Controller.java
+ Еще пара ссылок:
http://ru.wikipedia.org/wiki/Base64
http://ru.wikipedia.org/wiki/SHA1
—————————————————————————————————————————————————
После всех разъяснений настало время дать ответ на главный вопрос:
- Нет, из данных которые хранятся в базе данных НЕЛЬЗЯ воссоздать оригинальный пароль.
Как я уже сказал выше, хранимые в базе данные абсолютно не содержат никаких сведений об исходном пароле.
На этом пожалуй все...буду надеяться что не увижу больше таких тупых вопросов.
Если есть дополнения к моему материалу - пишите тут. Вопросы в этой тему буду удалять.
— Ålderdom - ingen glädje..
0
Войдите или зарегистрируйтесь чтобы ответить

