Проверка аккаунтов на живучесть
Одно из главных правил при выборе пароля — не использовать пароль, который уже засветился в каком-нибудь взломе и попал в одну из баз, доступных злоумышленникам. Даже если в вашем пароле 100500 символов, но он есть там — дело плохо. Например, потому что в программу для брутфорса паролей можно загрузить эту базу как словарный список. Как думаете, какой процент хешей она взломает, просто проверив весь словарный список? Вероятно, около 75% (реальную статистику см. ниже).
Так вот, откуда нам знать, какие пароли есть у злоумышленников? Благодаря специалисту по безопасности Трою Ханту можно проверить эти базы. Более того, их можно скачать к себе на компьютер и использовать для своих нужд. Это два текстовых файла в архивах: с 306 млн паролей (5,3 ГБ) и с 14 млн паролей (250 МБ).
Базы лежат на этой странице.
Все пароли в базе представлены в виде хешей SHA1. Перед хешированием все символы переведены в верхний регистр (прописные буквы). Трой Хант говорит, что применил функцию HASHBYTES, которая переводит хеши в верхний регистр. Так что делая свой хеш, следует осуществить аналогичную процедуру, если хотите найти совпадение.
Прямые ссылки:
https://downloads.pwnedpasswords.com/passwords/pwned-passwords-1.0.txt.7z
(306 млн паролей, 5,3 ГБ), зеркало
SHA1 hash of the 7-Zip file: 90d57d16a2dfe00de6cc58d0fa7882229ace4a53
SHA1 hash of the text file: d3f3ba6d05b9b451c2b59fd857d94ea421001b16
В разархивированном виде текстовый файл занимает 11,9 ГБ.
https://downloads.pwnedpasswords.com/passwords/pwned-passwords-update-1.txt.7z
(14 млн паролей, 250 МБ), зеркало
SHA1 hash of the 7-Zip file: 00fc585efad08a4b6323f8e4196aae9207f8b09f
SHA1 hash of the text file: 3fe6457fa8be6da10191bffa0f4cec43603a9f56
Если вы
GET https://haveibeenpwned.com/api/v2/pwnedpassword/ce0b2b771f7d468c0141918daea704e0e5ad45db?originalPasswordIsAHash=true
Но всё равно надёжнее проверять свой пароль в офлайне. Поэтому Трой Хант выложил базы в открытый доступ на дешёвом хостинге. Он отказался сидировать торрент, потому что это «затруднит доступ людей к информации» — многие организации блокируют торренты, а для него небольшие деньги за хостинг ничего не значат.
Хант рассказывает, где он раздобыл эти базы. Он говорит, что источников было много. Например, база Exploit.in содержит 805 499 391 адресов электронной почты с паролями. Задачей Ханта было извлечение уникальных паролей, поэтому он сразу начал анализ на совпадения. Оказалось, что в базе всего лишь 593 427 119 уникальных адресов и лишь 197 602 390 уникальных паролей. Это типичный результат: абсолютное большинство паролей (в данном случае, 75%) не уникальны и используются многими людьми. Собственно, поэтому и даётся рекомендация после генерации своего мастер-пароля сверять его по базе.
Вторым по величине источником информации был Anti Public: 562 077 488 строк, 457 962 538 уникальных почтовых адресов и ещё 96 684 629 уникальных паролей, которых не было в базе Exploit.in.
Остальные источники Трой Хант не называет, но в итоге у него получилось 306 259 512 уникальных паролей. На следующий день он добавил ещё 13 675 934, опять из неизвестного источника — эти пароли распространяются отдельным файлом.
Так что сейчас общее число паролей составляет 319 935 446 штук. Это по-настоящему уникальные пароли, которые прошли дедупликацию. Из нескольких версий пароля (P@55w0rd и p@55w0rd) в базу добавляется только одна (p@55w0rd).
После того, как Трой Хант спросил в твиттере, какой дешёвый хостинг ему могут посоветовать, на него вышла известная организация Cloudflare и предложила захостить файлы забесплатно. Трой согласился. Так что смело качайте файлы с хостинга, это бесплатно для автора.
Комментарии (94)
AlexanderS
04.08.2017 12:58+9Если вы глупы бесстрашны, то на той же странице можете ввести свой уникальный пароль и проверить его на наличие в базах, не скачивая их. Трой Хант обещает, что никак не будет использовать ваш пароль и его сервис абсолютно надёжен. «Не отправляйте свой активно используемый пароль ни на какой сервис — только на этот!», — убедительно заявляется на странице.
Новости через год: «Опубликована база с 500 млн уникальных паролей (8,5 ГБ)».DEmon_CDXLIV
04.08.2017 18:11+2Подозреваемый обвиняется в 17 убийствах. После следственного эксперимента, он обвиняется в 34 убийствах…
Bytamine
04.08.2017 13:06+28Do not send any password you actively use to a third-party service — even this one!
Не отправляйте свой активно используемый пароль ни на какой сервис — только на этот!
Ализар такой Ализар.
Utopia
04.08.2017 13:34Перед хешированием все символы переведены в верхний регистр (прописные буквы) — не в ВЕРХНИЙ, а в нижний — я проверил.
chig00
04.08.2017 16:55Пароли есть и в верхнем и в нижнем регистре, пример для паролей «test» и «TEST:
test, SHA1: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 на 202168230 строчке в файле pwned-passwords-1.0
TEST, SHA1: 984816fd329622876e14907634264e6f332e9fb3 на 8131272 строчке в файле pwned-passwords-update-1funca
06.08.2017 10:32+1получилось 306 259 512 уникальных паролей. На следующий день он добавил ещё 13 675 934, опять из неизвестного источника — эти пароли распространяются отдельным файлом.
alizar
Изначально в базу было собрано 306М паролей без учета регистра. В update-1 добавлено еще 14М паролей с учетом регистра (как я понял, источники те же, поменялся лишь процессинг), а в update-2 (уже после публикации этой статьи) — пароли длиннее 40 символов, которые ранее по ошибке обрезались. Таким образом *-update-1 база регистрозависима.
Cheater
04.08.2017 14:00+1Очень непоследовательное решение — позволить юзерам проверять свой пароль онлайн. Если объявляешь миру «вводить пароль на сторонних ресурсах опасно» — будь последователен и не реализуй на своём ресурсе именно эту возможность. Документация на API и обещание не передавать пароли третьим лицам не значат и не гарантируют ровно ничего.
Картинка на тему: https://pbs.twimg.com/media/Bu72nZSIEAAjWFF.jpg
KinsleR
04.08.2017 14:32Сложный пароль, использовал примерно год на почтовом ящике, недавно поменял, сейчас проверил — не скомпроментирован. Легкий пароль (существующее слово и три цирфы) используемый для единичной регистрации на всяких левых сайтах — не скомпроментирован…
Am0ralist
04.08.2017 14:51+8Вспоминается старенькое:
– Учитель, я подобрал хороший пароль, которого не может быть в словарях. Я ввёл его в Гугле, и убедился, что в Сети такого сочетания нет.
– Теперь есть.
izzholtik
04.08.2017 15:05Так себе база. Мой старый пароль, который в сеть утекал 3 раза за последние 5 лет (вот такой он невезучий), считает чистым.
potorof
04.08.2017 15:17-4Как проверить свой пароль, если не знаю, что такое хеш?
Firz
04.08.2017 15:39+1Узнать что такое хеш.
http://lmgtfy.com/?q=hashmotpac
04.08.2017 16:11-9Вы изменили мой мир этой ссылкой! Столько лет я учу людей гуглить, а тут ТАКОЕ!!! Дай бог вам здоровья и жениха хорошего ))))))
Ziere
04.08.2017 23:07+2Гугл довольно любопытные картинки предлагает начинающим криптоаналитикам.
Заголовок спойлераLyr
04.08.2017 16:55+1Самое время почитать что это такое.
В линуксе хеш пароля можно получить такecho -n СВОЙПАРОЛЬ |sha1sum
полученное значение искать в скачанных файликах.Cheater
04.08.2017 18:07+1Не надо так делать, пароль осядет в .bash_history.
sha1sum без аргументов, вводим пароль, Return, Ctrl+D.Lyr
04.08.2017 18:40В ubuntu можно пробельчик перед командой поставить.
Ernillgeek
04.08.2017 18:58+2Хоть в Ubuntu Linux, хоть в OpenBSD. Фишка с пробелом перед командой — вопрос bash'а. Если он у вас стоит где угодно, да хоть в винде по дефолту команды начинающиеся с пробела он игнорирует, это настраиваемо через HISTCONTROL в bashrc.
LenKagamine
04.08.2017 22:40+1Стоит помнить, что Return тоже воспринимается как отдельный символ и что 'qwerty' != 'qwerty\n'
Snowtomcat
04.08.2017 18:58Полученное значение необязательно искать в скачанных файликах — достаточно сгенерированный хеш вставить в поле пароля онлайн. Только что так нашел один из своих паролей (надо сказать довольно-таки кудрявый, с переменным регистром, цифрами и спец. символами и не имеющим логического смысла) в базе :(
Для проверки можете вставить хеш 5cec175b165e3d5e62c9e13ce848ef6feac81bff (что есть qwerty123).sic
04.08.2017 19:32Но все же лучше не вставлять и хеш ни в какие онлайн-формы третьих лиц. Особенно SHA1, которые скопом раскалываются ну очень легко на современных мощах.
bogolt
04.08.2017 20:38(на правах шутки )
Лучше так:
curl -X "POST" "http://заройте-ваши-данные-заройте-в-землю-тут/post" -d 'сервис:логин:пароль'
manchelsi
04.08.2017 16:55-12Вводил в базу 20 паролей сгенеренных по дефолту командой pwgen — 8ми символьные пароли без спец. символов. В базе не оказалось ни одного из 20.
Туфта, а не база.Cheater
04.08.2017 18:12+6На каком основании эти пароли должны были присутствовать в базе?
Cheater
04.08.2017 18:41+4(Поясняю: количество всех буквенно-цифровых паролей длины 8 = (26+10)^8 = число порядка 10^12.
Размер базы паролей — 320 млн — число порядка 10^8.
Вероятность с одной попытки попасть в подмножество размера 0.0001 от пространства исходов равна 0.0001.
Вероятность сделать это с 20 попыток равна 1-0.9999^20, что примерно равно 0,0019, т.е. порядка десятой доли процента.)
SLASH_CyberPunk
04.08.2017 16:55В большом файле присутствуют хеши, состоящие и заглавных букв, а не из строчных…
DmitryLeonov
04.08.2017 17:28+3Вообще-то он написал в блоге, что первая версия действительно сводила P@55w0rd к p@55w0rd, а дополнительный апдейт на 13 миллионов потребовался ровно чтобы вернуть отфильтрованные ложные дубли.
And then I added another 13,675,934 the following day to bring the total to 319,935,446 (let's just call it 320 million). Whilst this increase is only 4%, it's important because the initial processing I performed caused only one version of multiple passwords with different cases to be loaded. For example, «p@55w0rd» was loaded but not «P@55w0rd» with a capital «p». I'll explain these concepts in full shortly, but the online system is now properly case sensitive and the downloadable passwords have their first incremental update so you'll see both the initial 306 million plus «Update 1».
mistergrim
04.08.2017 19:21-1dfiles.ru
Среднее время скачивания в обычном режиме: 2321 минута
Да вы смеётесь.
SADKO
04.08.2017 22:15Попробовал несколько словарных паролей (на популярном азиатском языке) в другом регистре (на не менее популярном европейском) совпадений нет…
… в общем я так понимаю, что настоящему индейцу, нет смысла тут искать свой пароль от помоечной почты.MnogoBukv
04.08.2017 23:49+1а как вы их вводите не на своём компе, если прям вот приспичило по какой-то причине?
Shehrozs
04.08.2017 22:16Странно, в онлайн базе нашло 3 старых пароля, в оффлайн(в обоих архивах) только 1
ProRunner
04.08.2017 22:53Никто не подскажет, как бы с кипасса автоматом захэшировать пароли в SHA1, чтобы проверить?
centur
05.08.2017 04:54В оригинальной статье автор вроде как говорит — НЕ делайте так, не используйте свои активные пароли для проверки. А по вопросу — keepass умеет делать export текущей базы в нешифрованные форматы — экспортируйте в xml и можно использовать простой скрипт чтобы получить sha1. В целях безопасности — лучше это написать самому и проверить оффлайн, а не доверять стороннему плагину.
r85qPZ1d3y
04.08.2017 22:56-3Базы в открытом виде так понимаю нет?
r85qPZ1d3y
06.08.2017 17:02Я вроде для исследовательских целей спросил, а уже домыслы, что чёт взламывать решил, неплохо аудитория петушится на любой намек несанкционированного использования информации.
riartem
07.08.2017 00:00Видимо ваш коммент заминусили из-за того, что статья как-раз о том, что исследователь выложил эту базу в открытый доступ. Вы, видимо, забыли прочитать статью, прежде чем комментировать — отсюда и недовольство аудитории (лично я минус не ставил).
r85qPZ1d3y
08.08.2017 16:06riartem, я уточнил по поводу открытых паролей, я понимаю, что пост не подразумевает ссылку на неё, но возможно у кого то она имеется, что бывает часто. И этот кто то мог бы поделиться, если не жалко. В целом 4umak всё верно подметил.
По этому, в неумении читать можно лишь обвинить минусующих, хотя я полагаю, что ребята петушатся всё таки по другому поводу.
dark_ruby
04.08.2017 23:38+1а подскажите эффективный способ поиска по базе? grep?
Hellsy22
05.08.2017 01:45+2Могу выложить свой перловый скрипт, если у вас есть Perl. Ищет за доли секунды.
dark_ruby
05.08.2017 01:47я написал свой питон скрипт, но он медленный, зато позволяет искать сразу много паролей, и в разных регистрах.
поделитесь своим, я могу свой тоже показать если кому интересноHellsy22
05.08.2017 01:53+3Пожалуйста#!/usr/bin/perl use strict; use Digest::SHA1 qw(sha1_hex sha1_base64); my @pass = ('passwords', 'for', 'geeks'); for my $data (@pass) { my $d = uc(sha1_hex($data)); if (ff("pwned-passwords-1.0.txt", $d) || ff("pwned-passwords-update-1.txt ", $d)) { print sprintf("%15s\tFOUND\n", $data); } } sub ff { my ($fname, $data) = @_; my $fsize = -s $fname || die "File $fname not found"; local *F; open(F, "< $fname"); my $min = 0; my $max = $fsize / 42; while (1) { my $pos = int( ($max + $min) / 2); seek(F, $pos * 42, 0); my $row = <F>; chomp($row); chomp($row); if ($row lt $data) { if ($min == $pos || $min >= $max) { close F; return 0; } $min = $pos; } elsif ($row gt $data) { if ($max == $pos || $max == 0) { close F; return 0; } $max = $pos; } else { close F; return 1; } } return 0; }
ledascho
05.08.2017 15:34+1позволяет искать сразу много паролей, и в разных регистрах.
>fgrep -inH -f hashes.txt pwned-passwords-1.0.txt pwned-passwords-update-1.txt
Noizefan
05.08.2017 03:13Так вот, откуда нам знать, какие пароли есть у злоумышленников? Благодаря специалисту по безопасности Трою Ханту можно проверить эти базы на актуальность. Более того, их можно скачать к себе на компьютер и использовать для брутфорса чего только можно.
mike_y_k
05.08.2017 03:14спасибо за статью
пока качается напишу страничку для проверки
посмотрим как будет работать с полной базой после загрузки ;)
shashilx
05.08.2017 07:56-2пароли не проверял, базы скачал, глянул… а там хэши. ну и как мне эти ваши хэши скормить джону, а?! нафига мне эти ваши хэши, давайте оригинальный файл и чтоб регистрозависимый, а не приведённый в верхний реест (или не приведённый, непонятно). посоветуйте ктонить ОГРОМНЫЙ wordlist с русскими паролями в английских раскладках, я устал брутфорсить.
markhor
05.08.2017 10:17+2Цель базы не помочь вам брутфорсить, а помочь обычным людям проверять утекшие пароли без внешнего сервиса.
mike_y_k
05.08.2017 19:20Сделайте себе генератор паролей в любом виде и проверяйте их по той базе ;).
Все совпавшие составят Вам тот самый список. Дальше уже на своё усмотрение :D.
А статью таки стоило прочитать внимательнее, этот список не для того сделан.
McARIS74
05.08.2017 15:44Шикарная статья, давно об этом думал. Ведь собирают же злоумышленники, факт!
mike_y_k
05.08.2017 19:28Проверка своих паролей прошла успешно. Пока не скомпрометированы.
Надо будет добавить генерацию всех вариантов uc/lc для всех букв в пароле.
Тогда результат станет максимально информативным, особенно если дополнения таки будут идти с хешами на оригинальном case.
tendium
06.08.2017 08:45+1По-моему, он пароли к верхнему регистру не приводил, а просто пишет, что хэши у него в верхнем регистре. Вот цитата из его блога:
Also, just a quick note on the hashes: I processed all the passwords in a SQL Server DB then dumped out the hashes using the HASHBYTES function which represents them in uppercase. If you're comparing these to hashes on your end, make sure you either generate your hashes in uppercase or do a case insensitive comparison.mike_y_k
07.08.2017 10:01Для проверки истинности только генератор и сравнение.
Стоит наверное залить информацию в БД и написать скрипт для обновления.
bublichek
07.08.2017 10:08известная организация Cloudflare и предложила захостить файлы забесплатно
Так мило с их стороны. Такие няшки.
Jogger
07.08.2017 19:18проверил несколько старых паролей, которые давно не использую, и которые 100% были слиты. В базе их не нашлось. Учитывая количество паролей в базе — довольно странно. Хотя не исключаю вариант что я попадаю под правило «неуловимого Джо».
d1f
08.08.2017 06:07Пока проверяется опубликованным здесь perl скриптом, никто ничего не найдёт.
Потому что он делает двоичный поиск из предположения, что файлы хэшей отсортированы,
а это так только для update-2.
Самый большой файл и update-1 несортированы, я для проверки этого программу на C написал.
Нужно делать линейный поиск, а это долго…Hellsy22
08.08.2017 16:11Программа на С — это прямо-таки «аргумент».
А вот как выглядит программа на Perl для проверки отсортированности по возрастанию.local *F; open(F, "< pwned-passwords-1.0.txt"); my $p = ''; while (my $s = <F>) { print "ERR:\n$p$s" if ($p gt $s); $p = $s; } close(F);
d1f
09.08.2017 02:20> приняли за нарушения сортировки одинаковые строк
Ту вы правы — я допустил равные соседние строки и теперь все файлы
прошли проверку на сортированность.
А троллить перлом меня не надо, я его знаю и пользуюсь.
Но последовательно сканировать 12G данных построчным чтением… нет уж.
При таком чтении данные в памяти копируются два лишних раза — первый раз из буфера в ядре в буфер пространства пользователя
и ещё раз из буфера stdio в переменную пользователя.
Не знаю точно, как это организовано в перле, но одно лишнее копирование там точно есть.
Я же использую mmap и madvise.
А тот скрипт ни одного тестового пароля не нашёл,
хотя 'test' и '123' в тех файлах точно есть, я уже убедился.Hellsy22
09.08.2017 03:33УМВР.
my @pass = ('test', '123', '1234', '12345', 'd1f'); ... # perl finder.pl test FOUND 123 FOUND 1234 FOUND 12345 FOUND d1f FOUND
Давайте посмотрим, почему у вас не работает. Вы ничего с файлами не делали, например, не превращали перевод строки \r\n в просто \n? А то я поленился проверять размер строки, может быть у вас он не 42 байта, а 41.d1f
09.08.2017 05:14> УМВР
А у меня нет.
> Вы ничего с файлами не делали, например, не превращали перевод строки \r\n в просто \n?
Нет, не делал.
Но со скриптом делал — тестовые пароли с командной строки ввожу,
их ведь не жалко.Hellsy22
09.08.2017 14:00Боюсь, что скрипт не предназначен для работы с командной строкой — я не хотел бы, чтобы пароли оставались в истории. Внутри скрипта есть строчка для паролей:
my @pass = ('test', '123', '1234', '12345', 'd1f');
Если же вы хотите работать с командной строкой, то замените ее на:
my @pass = @ARGV;
или же в цикле ниже:
наfor my $data (@pass) {
for my $data (@ARGV) {
d1f
09.08.2017 14:20Перлу меня учить не надо.
Кстати, я доделал свою программу на C, теперь она ищет двоичным поиском.
mmap'ит файлы и bsearch().
А пароли вводятся с stdin.
Все стандартные 123… находятся, а моих паролей нет и я этим доволен.Hellsy22
09.08.2017 15:45Читать на каждом запуске 13 гигабайт с носителя? Да еще и загонять в память? Это довольно странный ход, с учетом того, что средний поиск пароля по файлу требует чтения ~32 блоков и выполняется за пол-миллисекунды даже на моем десктопе. Впрочем, каждый развлекается как ему нравится.
d1f
09.08.2017 16:33mmap — это не чтение/загоняние в память файла,
это чтение нужных страниц по обращению к адресу памяти.
А поскольку теперь двоичный поиск, то грузятся только те страницы,
в которых ключи, через которые поиск проходит, а это сильно меньше.
> выполняется за пол-миллисекунды даже на моем десктопе.
Зависит от параметров вашего десктопа, размера L3 кеша, размера ОЗУ
(сколько у вас GB? У меня 4).
real 0m2.256s
user 0m0.000s
sys 0m0.000s
mike_y_k
09.08.2017 16:42Все строки в двоичное представление и в базу.
Потом и искать ничего не нужно — просто SQL запрос и дальше по результату.
DBMS с такими объемами играючи справится.
Ну и задел н будущее — вторым полем можно будет хранить исходную последовательность ;).
Как собственно в оригинале и реализовано было.Hellsy22
10.08.2017 05:34Лучше в двоичное представление и в файл. Все-таки у СУБД избыточность велика. Я вот попробовал загнать в постгресс, получил скорость в 3 раза ниже, чем при работе с файлами и периодические провисания по 0.2 сек.
И размер базы в 40G вместо 10G (компрессия так себе, но все-таки).
Если тут кто-то разбирается в оптимизации СУБД, то я бы с интересом выслушал, как это оптимизировать.
На данный момент все выглядит так# \d passhash Table "public.passhash" Column | Type | Modifiers --------+-------+----------- sha1 | bytea | not null Indexes: "passhash_pkey" PRIMARY KEY, btree (sha1) # select count(*) from passhash; count ----------- 320294464 (1 row) Функция для упрощения поиска: # CREATE or REPLACE FUNCTION findpass(text) returns text AS $$ select ($1 || ' OK') from passhash where sha1=(select digest($1, 'sha1')) $$ LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; # select findpass('justapass'); findpass -------------- justapass OK (1 row) Time: 3.247 ms
mike_y_k
11.08.2017 22:17Ну продолжение пока в планах, может за выходные попробую.
А там посмотрим.
Надо попробовать без индексации и как вариант хешированный поиск в файле ;).Hellsy22
11.08.2017 22:23Без индексации поиск занимает вечность. Если заменить btree на hash, то результаты в среднем такие же, но индекс занимает не 24 гигабайта, а «всего» 13.
vlreshet
Проверил онлайн свои два старые (уже не использую), не словарные пароли — пишет что скомпрометированы. Поменял в них по одному символу — всё нормально. Вот чёрт, походу реально скомпрометированы
StjarnornasFred
Ну а толку? База данных пин-кодов банковских карт тоже слита, ну и что?
Брутфорс миллиона паролей, учитывая пинг сервера и время соединения, займёт месяцы времени в непрерывном режиме.
chig00
Опасность в том что будет скомпрометирована база данных какого-то сервиса. Даже если сервис хранил пароли в виде хэша с солью, то пароли из приведенного списка будут без проблем подобраны офлайновым перебором. А дальше если пароль используется пользователем в других сервисах то есть вероятность что и логин будет или одинаковым или легко угадываемым.
mike_y_k
Похоже никто не оценил юмора ссылки :D.