Опубликована база с 320 млн уникальных паролей (5,5 ГБ)


    Проверка аккаунтов на живучесть

    Одно из главных правил при выборе пароля — не использовать пароль, который уже засветился в каком-нибудь взломе и попал в одну из баз, доступных злоумышленникам. Даже если в вашем пароле 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


    Если вы глупы бесстрашны, то на той же странице можете ввести свой уникальный пароль и проверить его на наличие в базах, не скачивая их. Трой Хант обещает, что никак не будет использовать ваш пароль и его сервис абсолютно надёжен. «Не отправляйте свой активно используемый пароль ни на какой сервис — даже на этот!», — предупреждается на странице. Программные интерфейсы этого сервиса полностью документированы, они принимают хеши SHA1 примерно таким образом:

    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 и предложила захостить файлы забесплатно. Трой согласился. Так что смело качайте файлы с хостинга, это бесплатно для автора.

    Комментарии 97

      +1
      Проверил онлайн свои два старые (уже не использую), не словарные пароли — пишет что скомпрометированы. Поменял в них по одному символу — всё нормально. Вот чёрт, походу реально скомпрометированы
        +5
        Ну а толку? База данных пин-кодов банковских карт тоже слита, ну и что?

        Брутфорс миллиона паролей, учитывая пинг сервера и время соединения, займёт месяцы времени в непрерывном режиме.
          +1
          Опасность в том что будет скомпрометирована база данных какого-то сервиса. Даже если сервис хранил пароли в виде хэша с солью, то пароли из приведенного списка будут без проблем подобраны офлайновым перебором. А дальше если пароль используется пользователем в других сервисах то есть вероятность что и логин будет или одинаковым или легко угадываемым.
          • НЛО прилетело и опубликовало эту надпись здесь
          +9
          Если вы глупы бесстрашны, то на той же странице можете ввести свой уникальный пароль и проверить его на наличие в базах, не скачивая их. Трой Хант обещает, что никак не будет использовать ваш пароль и его сервис абсолютно надёжен. «Не отправляйте свой активно используемый пароль ни на какой сервис — только на этот!», — убедительно заявляется на странице.

          Новости через год: «Опубликована база с 500 млн уникальных паролей (8,5 ГБ)».
            +1
            А ещё там написано, что на той же странице можно проверять по SHA1 хешу.
              +2
              Подозреваемый обвиняется в 17 убийствах. После следственного эксперимента, он обвиняется в 34 убийствах…
              +28
              Do not send any password you actively use to a third-party service — even this one!

              Не отправляйте свой активно используемый пароль ни на какой сервис — только на этот!

              Ализар такой Ализар.
              • НЛО прилетело и опубликовало эту надпись здесь
                  +4
                  О, спасибо, что заметили, поправил.
                  0
                  Перед хешированием все символы переведены в верхний регистр (прописные буквы) — не в ВЕРХНИЙ, а в нижний — я проверил.
                    0
                    Пока смотрю pwned-passwords-update-1.txt.7z: есть пароли в обоих и смешанных регистрах.
                      0
                      как вы это определили по хешам?
                        0
                        Очень же просто — брутфорс запустил.
                      0
                      Пароли есть и в верхнем и в нижнем регистре, пример для паролей «test» и «TEST:
                      test, SHA1: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 на 202168230 строчке в файле pwned-passwords-1.0
                      TEST, SHA1: 984816fd329622876e14907634264e6f332e9fb3 на 8131272 строчке в файле pwned-passwords-update-1
                        +1
                        получилось 306 259 512 уникальных паролей. На следующий день он добавил ещё 13 675 934, опять из неизвестного источника — эти пароли распространяются отдельным файлом.
                        alizar

                        Изначально в базу было собрано 306М паролей без учета регистра. В update-1 добавлено еще 14М паролей с учетом регистра (как я понял, источники те же, поменялся лишь процессинг), а в update-2 (уже после публикации этой статьи) — пароли длиннее 40 символов, которые ранее по ошибке обрезались. Таким образом *-update-1 база регистрозависима.
                      +1
                      Очень непоследовательное решение — позволить юзерам проверять свой пароль онлайн. Если объявляешь миру «вводить пароль на сторонних ресурсах опасно» — будь последователен и не реализуй на своём ресурсе именно эту возможность. Документация на API и обещание не передавать пароли третьим лицам не значат и не гарантируют ровно ничего.

                      Картинка на тему: https://pbs.twimg.com/media/Bu72nZSIEAAjWFF.jpg
                        0
                        Сложный пароль, использовал примерно год на почтовом ящике, недавно поменял, сейчас проверил — не скомпроментирован. Легкий пароль (существующее слово и три цирфы) используемый для единичной регистрации на всяких левых сайтах — не скомпроментирован…
                          0
                          Помониторьте через сколько он там появится
                            +2
                            Ради этого и вбил, и даже поставил напоминалку :)
                          –1
                          Хорошая попытка, спецслужбы, но нет.
                            +8
                            Вспоминается старенькое:
                            – Учитель, я подобрал хороший пароль, которого не может быть в словарях. Я ввёл его в Гугле, и убедился, что в Сети такого сочетания нет.
                            – Теперь есть.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                +5
                                (вот такой он невезучий)
                                Вы уверены, что тут в невезении дело?
                                –4
                                Как проверить свой пароль, если не знаю, что такое хеш?
                                  +1
                                  Узнать что такое хеш.
                                  http://lmgtfy.com/?q=hash
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      +2
                                      Гугл довольно любопытные картинки предлагает начинающим криптоаналитикам.
                                      Заголовок спойлера
                                      hash
                                        +2
                                        +1
                                        Самое время почитать что это такое.

                                        В линуксе хеш пароля можно получить так
                                        echo -n СВОЙПАРОЛЬ |sha1sum

                                        полученное значение искать в скачанных файликах.
                                          +1
                                          Не надо так делать, пароль осядет в .bash_history.

                                          sha1sum без аргументов, вводим пароль, Return, Ctrl+D.
                                            0
                                            В ubuntu можно пробельчик перед командой поставить.
                                              +2
                                              Хоть в Ubuntu Linux, хоть в OpenBSD. Фишка с пробелом перед командой — вопрос bash'а. Если он у вас стоит где угодно, да хоть в винде по дефолту команды начинающиеся с пробела он игнорирует, это настраиваемо через HISTCONTROL в bashrc.
                                              0
                                              del
                                                +1
                                                Стоит помнить, что Return тоже воспринимается как отдельный символ и что 'qwerty' != 'qwerty\n'
                                                0
                                                Полученное значение необязательно искать в скачанных файликах — достаточно сгенерированный хеш вставить в поле пароля онлайн. Только что так нашел один из своих паролей (надо сказать довольно-таки кудрявый, с переменным регистром, цифрами и спец. символами и не имеющим логического смысла) в базе :(

                                                Для проверки можете вставить хеш 5cec175b165e3d5e62c9e13ce848ef6feac81bff (что есть qwerty123).
                                                  0
                                                  Но все же лучше не вставлять и хеш ни в какие онлайн-формы третьих лиц. Особенно SHA1, которые скопом раскалываются ну очень легко на современных мощах.
                                                  0
                                                  (на правах шутки )
                                                  Лучше так:
                                                  curl -X "POST" "http://заройте-ваши-данные-заройте-в-землю-тут/post" -d 'сервис:логин:пароль'
                                                  


                                                –12
                                                Вводил в базу 20 паролей сгенеренных по дефолту командой pwgen — 8ми символьные пароли без спец. символов. В базе не оказалось ни одного из 20.
                                                Туфта, а не база.
                                                  +6
                                                  На каком основании эти пароли должны были присутствовать в базе?
                                                    +4
                                                    (Поясняю: количество всех буквенно-цифровых паролей длины 8 = (26+10)^8 = число порядка 10^12.
                                                    Размер базы паролей — 320 млн — число порядка 10^8.

                                                    Вероятность с одной попытки попасть в подмножество размера 0.0001 от пространства исходов равна 0.0001.
                                                    Вероятность сделать это с 20 попыток равна 1-0.9999^20, что примерно равно 0,0019, т.е. порядка десятой доли процента.)
                                                  0
                                                  В большом файле присутствуют хеши, состоящие и заглавных букв, а не из строчных…
                                                    +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».
                                                      –1

                                                      dfiles.ru


                                                      Среднее время скачивания в обычном режиме: 2321 минута


                                                      Да вы смеётесь.

                                                        +5
                                                        Еще и капчу с издевкой подсовывают.

                                                        image
                                                        0
                                                        Угу, хреново жить без соли
                                                          0
                                                          Попробовал несколько словарных паролей (на популярном азиатском языке) в другом регистре (на не менее популярном европейском) совпадений нет…
                                                          … в общем я так понимаю, что настоящему индейцу, нет смысла тут искать свой пароль от помоечной почты.
                                                            +1
                                                            а как вы их вводите не на своём компе, если прям вот приспичило по какой-то причине?
                                                            0
                                                            Странно, в онлайн базе нашло 3 старых пароля, в оффлайн(в обоих архивах) только 1
                                                              0
                                                              Никто не подскажет, как бы с кипасса автоматом захэшировать пароли в SHA1, чтобы проверить?
                                                                0
                                                                В оригинальной статье автор вроде как говорит — НЕ делайте так, не используйте свои активные пароли для проверки. А по вопросу — keepass умеет делать export текущей базы в нешифрованные форматы — экспортируйте в xml и можно использовать простой скрипт чтобы получить sha1. В целях безопасности — лучше это написать самому и проверить оффлайн, а не доверять стороннему плагину.
                                                                –3
                                                                Базы в открытом виде так понимаю нет?
                                                                  0
                                                                  Я вроде для исследовательских целей спросил, а уже домыслы, что чёт взламывать решил, неплохо аудитория петушится на любой намек несанкционированного использования информации.
                                                                    0
                                                                    Видимо ваш коммент заминусили из-за того, что статья как-раз о том, что исследователь выложил эту базу в открытый доступ. Вы, видимо, забыли прочитать статью, прежде чем комментировать — отсюда и недовольство аудитории (лично я минус не ставил).
                                                                      0
                                                                      Полагаю, вопрос был про пароли в нехешированном виде:)
                                                                        0
                                                                        riartem, я уточнил по поводу открытых паролей, я понимаю, что пост не подразумевает ссылку на неё, но возможно у кого то она имеется, что бывает часто. И этот кто то мог бы поделиться, если не жалко. В целом 4umak всё верно подметил.
                                                                        По этому, в неумении читать можно лишь обвинить минусующих, хотя я полагаю, что ребята петушатся всё таки по другому поводу.
                                                                    +1
                                                                    а подскажите эффективный способ поиска по базе? grep?
                                                                      +2
                                                                      Могу выложить свой перловый скрипт, если у вас есть Perl. Ищет за доли секунды.
                                                                        0
                                                                        я написал свой питон скрипт, но он медленный, зато позволяет искать сразу много паролей, и в разных регистрах.
                                                                        поделитесь своим, я могу свой тоже показать если кому интересно
                                                                          +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;
                                                                          }
                                                                          

                                                                            +1
                                                                            позволяет искать сразу много паролей, и в разных регистрах.

                                                                            >fgrep -inH -f hashes.txt pwned-passwords-1.0.txt pwned-passwords-update-1.txt
                                                                            0

                                                                            Аналог вашего скрипта (тот же алгоритм) на питоне.
                                                                            pwned-pass-fast.py

                                                                          –2
                                                                          Проверил пароли, которые использую уже лет 15+ — ни один не засветился.
                                                                            0
                                                                            Так вот, откуда нам знать, какие пароли есть у злоумышленников? Благодаря специалисту по безопасности Трою Ханту можно проверить эти базы на актуальность. Более того, их можно скачать к себе на компьютер и использовать для брутфорса чего только можно.
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                не надо страничку, пожалуйста!
                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                    0
                                                                                    Всё равно не надо.
                                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                                –2
                                                                                пароли не проверял, базы скачал, глянул… а там хэши. ну и как мне эти ваши хэши скормить джону, а?! нафига мне эти ваши хэши, давайте оригинальный файл и чтоб регистрозависимый, а не приведённый в верхний реест (или не приведённый, непонятно). посоветуйте ктонить ОГРОМНЫЙ wordlist с русскими паролями в английских раскладках, я устал брутфорсить.
                                                                                  +2
                                                                                  Цель базы не помочь вам брутфорсить, а помочь обычным людям проверять утекшие пароли без внешнего сервиса.
                                                                                    0
                                                                                    вы считаете, что я говорю о цели? давайте я вам процитирую заголовок (желтый конечно же или у вас сомнения) — Опубликована база с 320 млн уникальных паролей (5,5 ГБ) — гдето в заголовке есть надпись хэш? может хэшированная есть слово? заметил, что 90% авторов гиктаймса и хабры — покусаны журналистами конечно же. ну, напиши ты, что хэшей паролей, это сложно да? но конечно же, кто же будет читать статью, качать… кому нафиг сдались хэши, конечно же.
                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                    0
                                                                                    Шикарная статья, давно об этом думал. Ведь собирают же злоумышленники, факт!
                                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                                        +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.
                                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                                          0
                                                                                          известная организация Cloudflare и предложила захостить файлы забесплатно

                                                                                          Так мило с их стороны. Такие няшки.
                                                                                            0
                                                                                            проверил несколько старых паролей, которые давно не использую, и которые 100% были слиты. В базе их не нашлось. Учитывая количество паролей в базе — довольно странно. Хотя не исключаю вариант что я попадаю под правило «неуловимого Джо».
                                                                                              0
                                                                                              Пока проверяется опубликованным здесь perl скриптом, никто ничего не найдёт.
                                                                                              Потому что он делает двоичный поиск из предположения, что файлы хэшей отсортированы,
                                                                                              а это так только для update-2.
                                                                                              Самый большой файл и update-1 несортированы, я для проверки этого программу на C написал.
                                                                                              Нужно делать линейный поиск, а это долго…
                                                                                                0
                                                                                                Программа на С — это прямо-таки «аргумент».
                                                                                                А вот как выглядит программа на 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);

                                                                                                И согласно результатам ее работы — там все в порядке с сортировкой, но вы можете указать конкретные строки идущие не по порядку. Предположу, что вы несколько поторопились и приняли за нарушения сортировки одинаковые строки типа:
                                                                                                000D72C5C8DEB3547BCEFCD3DE73677BC3DC8519

                                                                                                  0
                                                                                                  > приняли за нарушения сортировки одинаковые строк

                                                                                                  Ту вы правы — я допустил равные соседние строки и теперь все файлы
                                                                                                  прошли проверку на сортированность.

                                                                                                  А троллить перлом меня не надо, я его знаю и пользуюсь.
                                                                                                  Но последовательно сканировать 12G данных построчным чтением… нет уж.
                                                                                                  При таком чтении данные в памяти копируются два лишних раза — первый раз из буфера в ядре в буфер пространства пользователя
                                                                                                  и ещё раз из буфера stdio в переменную пользователя.
                                                                                                  Не знаю точно, как это организовано в перле, но одно лишнее копирование там точно есть.
                                                                                                  Я же использую mmap и madvise.

                                                                                                  А тот скрипт ни одного тестового пароля не нашёл,
                                                                                                  хотя 'test' и '123' в тех файлах точно есть, я уже убедился.
                                                                                                    0
                                                                                                    УМВР.
                                                                                                    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.
                                                                                                      0
                                                                                                      > УМВР

                                                                                                      А у меня нет.

                                                                                                      > Вы ничего с файлами не делали, например, не превращали перевод строки \r\n в просто \n?

                                                                                                      Нет, не делал.

                                                                                                      Но со скриптом делал — тестовые пароли с командной строки ввожу,
                                                                                                      их ведь не жалко.
                                                                                                        0
                                                                                                        Боюсь, что скрипт не предназначен для работы с командной строкой — я не хотел бы, чтобы пароли оставались в истории. Внутри скрипта есть строчка для паролей:
                                                                                                        my @pass = ('test', '123', '1234', '12345', 'd1f');
                                                                                                        

                                                                                                        Если же вы хотите работать с командной строкой, то замените ее на:
                                                                                                        my @pass = @ARGV;
                                                                                                        

                                                                                                        или же в цикле ниже:
                                                                                                        for my $data (@pass) {
                                                                                                        
                                                                                                        на
                                                                                                        for my $data (@ARGV) {
                                                                                                        

                                                                                                          0
                                                                                                          Перлу меня учить не надо.

                                                                                                          Кстати, я доделал свою программу на C, теперь она ищет двоичным поиском.
                                                                                                          mmap'ит файлы и bsearch().
                                                                                                          А пароли вводятся с stdin.
                                                                                                          Все стандартные 123… находятся, а моих паролей нет и я этим доволен.
                                                                                                            0
                                                                                                            Читать на каждом запуске 13 гигабайт с носителя? Да еще и загонять в память? Это довольно странный ход, с учетом того, что средний поиск пароля по файлу требует чтения ~32 блоков и выполняется за пол-миллисекунды даже на моем десктопе. Впрочем, каждый развлекается как ему нравится.
                                                                                                              0
                                                                                                              mmap — это не чтение/загоняние в память файла,
                                                                                                              это чтение нужных страниц по обращению к адресу памяти.
                                                                                                              А поскольку теперь двоичный поиск, то грузятся только те страницы,
                                                                                                              в которых ключи, через которые поиск проходит, а это сильно меньше.

                                                                                                              > выполняется за пол-миллисекунды даже на моем десктопе.

                                                                                                              Зависит от параметров вашего десктопа, размера L3 кеша, размера ОЗУ
                                                                                                              (сколько у вас GB? У меня 4).

                                                                                                              real 0m2.256s
                                                                                                              user 0m0.000s
                                                                                                              sys 0m0.000s
                                                                                                                0
                                                                                                                У меня SSD, в данном случае это, видимо, играет определяющую роль.
                                                                                                0
                                                                                                del
                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                    0
                                                                                                    Лучше в двоичное представление и в файл. Все-таки у СУБД избыточность велика. Я вот попробовал загнать в постгресс, получил скорость в 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
                                                                                                    
                                                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                        0
                                                                                                        Без индексации поиск занимает вечность. Если заменить btree на hash, то результаты в среднем такие же, но индекс занимает не 24 гигабайта, а «всего» 13.
                                                                                                    0
                                                                                                    Линуксовый однострочник для быстрой проверки пароля на наличие в базе, без отправки его или его полного хэша на сервер:
                                                                                                    echo -n "password" | sha1sum | awk '{prefix = substr($1,1,5); reminder = substr($1,6,35); res = system("curl -s https://api.pwnedpasswords.com/range/" prefix "| tr [A-Z] [a-z] | grep \"" reminder "\""); if(res) print "No answer" }'

                                                                                                    Результат:

                                                                                                    1e4c9b93f3f0682250b6cf8331b7ee68fd8:3533661

                                                                                                    Значит пароль password «попался в сети» 3533661 раз.

                                                                                                    Если же в ответ ничего не вывелось, значит пароля в базе нет. Если ответ «No answer», значит нет связи с сервером Троя.
                                                                                                      0
                                                                                                      В предыдущем однострочнике есть косяк, который приводит к тому, что если пароля нет в базе, то выводится сообщение 'No answer'. Ниже приведён улучшенный однострочник, с исправленной ошибкой:

                                                                                                      echo -n 'password' | sha1sum | awk '{prefix=substr($1,1,5); reminder=substr($1,6,35); if(system("curl -s https://api.pwnedpasswords.com/range/" prefix "> ./pwhashes.txt")){print "Error"; exit} cmd="cat ./pwhashes.txt | tr [A-Z] [a-z] | grep \"" reminder "\""; cmd | getline result; close(cmd); split(result,arr,":"); if(!length(arr[2])) print "Password not found"; else print "Password found: " arr[2]}'

                                                                                                      Если при запросе произошла какая-нибудь ошибка (неважно — какая), будет выведено сообщение «Error».
                                                                                                      Если пароль «чистый», то есть не находится в базе, будет выведено сообщение «Password not found».
                                                                                                      Если же пароль «засвечен» в базе, то будет выведено сообщение «Password found: NNN». Где NNN — количество аккаунтов в базе, имеющих данный пароль.

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

                                                                                                    Самое читаемое