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

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

Комментарии (94)


  1. vlreshet
    04.08.2017 12:52
    +1

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


    1. StjarnornasFred
      04.08.2017 16:23
      +5

      Ну а толку? База данных пин-кодов банковских карт тоже слита, ну и что?

      Брутфорс миллиона паролей, учитывая пинг сервера и время соединения, займёт месяцы времени в непрерывном режиме.


      1. chig00
        04.08.2017 17:03
        +1

        Опасность в том что будет скомпрометирована база данных какого-то сервиса. Даже если сервис хранил пароли в виде хэша с солью, то пароли из приведенного списка будут без проблем подобраны офлайновым перебором. А дальше если пароль используется пользователем в других сервисах то есть вероятность что и логин будет или одинаковым или легко угадываемым.


      1. mike_y_k
        05.08.2017 02:56
        +5

        Похоже никто не оценил юмора ссылки :D.


  1. AlexanderS
    04.08.2017 12:58
    +9

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

    Новости через год: «Опубликована база с 500 млн уникальных паролей (8,5 ГБ)».


    1. StepFan
      04.08.2017 16:47
      +1

      А ещё там написано, что на той же странице можно проверять по SHA1 хешу.


    1. DEmon_CDXLIV
      04.08.2017 18:11
      +2

      Подозреваемый обвиняется в 17 убийствах. После следственного эксперимента, он обвиняется в 34 убийствах…


  1. Bytamine
    04.08.2017 13:06
    +28

    Do not send any password you actively use to a third-party service — even this one!

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

    Ализар такой Ализар.


    1. Dmitry_5
      04.08.2017 15:49
      +1

      Ализавр...


    1. alizar Автор
      04.08.2017 16:47
      +4

      О, спасибо, что заметили, поправил.


  1. Utopia
    04.08.2017 13:34

    Перед хешированием все символы переведены в верхний регистр (прописные буквы) — не в ВЕРХНИЙ, а в нижний — я проверил.


    1. sic
      04.08.2017 14:56

      Пока смотрю pwned-passwords-update-1.txt.7z: есть пароли в обоих и смешанных регистрах.


      1. old_bear
        04.08.2017 16:19

        как вы это определили по хешам?


        1. sic
          04.08.2017 16:26

          Очень же просто — брутфорс запустил.


    1. chig00
      04.08.2017 16:55

      Пароли есть и в верхнем и в нижнем регистре, пример для паролей «test» и «TEST:
      test, SHA1: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 на 202168230 строчке в файле pwned-passwords-1.0
      TEST, SHA1: 984816fd329622876e14907634264e6f332e9fb3 на 8131272 строчке в файле pwned-passwords-update-1


      1. funca
        06.08.2017 10:32
        +1

        получилось 306 259 512 уникальных паролей. На следующий день он добавил ещё 13 675 934, опять из неизвестного источника — эти пароли распространяются отдельным файлом.
        alizar

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


  1. Cheater
    04.08.2017 14:00
    +1

    Очень непоследовательное решение — позволить юзерам проверять свой пароль онлайн. Если объявляешь миру «вводить пароль на сторонних ресурсах опасно» — будь последователен и не реализуй на своём ресурсе именно эту возможность. Документация на API и обещание не передавать пароли третьим лицам не значат и не гарантируют ровно ничего.

    Картинка на тему: https://pbs.twimg.com/media/Bu72nZSIEAAjWFF.jpg


  1. KinsleR
    04.08.2017 14:32

    Сложный пароль, использовал примерно год на почтовом ящике, недавно поменял, сейчас проверил — не скомпроментирован. Легкий пароль (существующее слово и три цирфы) используемый для единичной регистрации на всяких левых сайтах — не скомпроментирован…


    1. Sky4eg
      04.08.2017 15:03

      Помониторьте через сколько он там появится


      1. KinsleR
        04.08.2017 15:04
        +2

        Ради этого и вбил, и даже поставил напоминалку :)


  1. Een_Stemming
    04.08.2017 14:36
    -1

    Хорошая попытка, спецслужбы, но нет.


  1. Am0ralist
    04.08.2017 14:51
    +8

    Вспоминается старенькое:
    – Учитель, я подобрал хороший пароль, которого не может быть в словарях. Я ввёл его в Гугле, и убедился, что в Сети такого сочетания нет.
    – Теперь есть.


  1. izzholtik
    04.08.2017 15:05

    Так себе база. Мой старый пароль, который в сеть утекал 3 раза за последние 5 лет (вот такой он невезучий), считает чистым.


    1. LoadRunner
      04.08.2017 15:19
      +5

      (вот такой он невезучий)
      Вы уверены, что тут в невезении дело?


  1. potorof
    04.08.2017 15:17
    -4

    Как проверить свой пароль, если не знаю, что такое хеш?


    1. Firz
      04.08.2017 15:39
      +1

      Узнать что такое хеш.
      http://lmgtfy.com/?q=hash


      1. motpac
        04.08.2017 16:11
        -9

        Вы изменили мой мир этой ссылкой! Столько лет я учу людей гуглить, а тут ТАКОЕ!!! Дай бог вам здоровья и жениха хорошего ))))))


      1. Ziere
        04.08.2017 23:07
        +2

        Гугл довольно любопытные картинки предлагает начинающим криптоаналитикам.

        Заголовок спойлера
        hash


      1. potorof
        05.08.2017 00:58
        +2

    1. Lyr
      04.08.2017 16:55
      +1

      Самое время почитать что это такое.

      В линуксе хеш пароля можно получить так

      echo -n СВОЙПАРОЛЬ |sha1sum

      полученное значение искать в скачанных файликах.


      1. Cheater
        04.08.2017 18:07
        +1

        Не надо так делать, пароль осядет в .bash_history.

        sha1sum без аргументов, вводим пароль, Return, Ctrl+D.


        1. Lyr
          04.08.2017 18:40

          В ubuntu можно пробельчик перед командой поставить.


          1. Ernillgeek
            04.08.2017 18:58
            +2

            Хоть в Ubuntu Linux, хоть в OpenBSD. Фишка с пробелом перед командой — вопрос bash'а. Если он у вас стоит где угодно, да хоть в винде по дефолту команды начинающиеся с пробела он игнорирует, это настраиваемо через HISTCONTROL в bashrc.


        1. buggykey
          04.08.2017 19:30

          del


        1. LenKagamine
          04.08.2017 22:40
          +1

          Стоит помнить, что Return тоже воспринимается как отдельный символ и что 'qwerty' != 'qwerty\n'


      1. Snowtomcat
        04.08.2017 18:58

        Полученное значение необязательно искать в скачанных файликах — достаточно сгенерированный хеш вставить в поле пароля онлайн. Только что так нашел один из своих паролей (надо сказать довольно-таки кудрявый, с переменным регистром, цифрами и спец. символами и не имеющим логического смысла) в базе :(

        Для проверки можете вставить хеш 5cec175b165e3d5e62c9e13ce848ef6feac81bff (что есть qwerty123).


        1. sic
          04.08.2017 19:32

          Но все же лучше не вставлять и хеш ни в какие онлайн-формы третьих лиц. Особенно SHA1, которые скопом раскалываются ну очень легко на современных мощах.


      1. bogolt
        04.08.2017 20:38

        (на правах шутки )
        Лучше так:

        curl -X "POST" "http://заройте-ваши-данные-заройте-в-землю-тут/post" -d 'сервис:логин:пароль'
        



  1. manchelsi
    04.08.2017 16:55
    -12

    Вводил в базу 20 паролей сгенеренных по дефолту командой pwgen — 8ми символьные пароли без спец. символов. В базе не оказалось ни одного из 20.
    Туфта, а не база.


    1. Cheater
      04.08.2017 18:12
      +6

      На каком основании эти пароли должны были присутствовать в базе?


      1. 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, т.е. порядка десятой доли процента.)


  1. SLASH_CyberPunk
    04.08.2017 16:55

    В большом файле присутствуют хеши, состоящие и заглавных букв, а не из строчных…


  1. 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».


  1. mistergrim
    04.08.2017 19:21
    -1

    dfiles.ru


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


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


    1. express
      05.08.2017 07:04
      +5

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

      image


  1. KonstantinSoloviov
    04.08.2017 20:55

    Угу, хреново жить без соли


  1. SADKO
    04.08.2017 22:15

    Попробовал несколько словарных паролей (на популярном азиатском языке) в другом регистре (на не менее популярном европейском) совпадений нет…
    … в общем я так понимаю, что настоящему индейцу, нет смысла тут искать свой пароль от помоечной почты.


    1. MnogoBukv
      04.08.2017 23:49
      +1

      а как вы их вводите не на своём компе, если прям вот приспичило по какой-то причине?


  1. Shehrozs
    04.08.2017 22:16

    Странно, в онлайн базе нашло 3 старых пароля, в оффлайн(в обоих архивах) только 1


  1. ProRunner
    04.08.2017 22:53

    Никто не подскажет, как бы с кипасса автоматом захэшировать пароли в SHA1, чтобы проверить?


    1. centur
      05.08.2017 04:54

      В оригинальной статье автор вроде как говорит — НЕ делайте так, не используйте свои активные пароли для проверки. А по вопросу — keepass умеет делать export текущей базы в нешифрованные форматы — экспортируйте в xml и можно использовать простой скрипт чтобы получить sha1. В целях безопасности — лучше это написать самому и проверить оффлайн, а не доверять стороннему плагину.


  1. r85qPZ1d3y
    04.08.2017 22:56
    -3

    Базы в открытом виде так понимаю нет?


    1. r85qPZ1d3y
      06.08.2017 17:02

      Я вроде для исследовательских целей спросил, а уже домыслы, что чёт взламывать решил, неплохо аудитория петушится на любой намек несанкционированного использования информации.


      1. riartem
        07.08.2017 00:00

        Видимо ваш коммент заминусили из-за того, что статья как-раз о том, что исследователь выложил эту базу в открытый доступ. Вы, видимо, забыли прочитать статью, прежде чем комментировать — отсюда и недовольство аудитории (лично я минус не ставил).


        1. 4umak
          07.08.2017 14:25

          Полагаю, вопрос был про пароли в нехешированном виде:)


        1. r85qPZ1d3y
          08.08.2017 16:06

          riartem, я уточнил по поводу открытых паролей, я понимаю, что пост не подразумевает ссылку на неё, но возможно у кого то она имеется, что бывает часто. И этот кто то мог бы поделиться, если не жалко. В целом 4umak всё верно подметил.
          По этому, в неумении читать можно лишь обвинить минусующих, хотя я полагаю, что ребята петушатся всё таки по другому поводу.


  1. dark_ruby
    04.08.2017 23:38
    +1

    а подскажите эффективный способ поиска по базе? grep?


    1. Hellsy22
      05.08.2017 01:45
      +2

      Могу выложить свой перловый скрипт, если у вас есть Perl. Ищет за доли секунды.


      1. dark_ruby
        05.08.2017 01:47

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


        1. 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;
          }
          


        1. ledascho
          05.08.2017 15:34
          +1

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

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


      1. AlexanderZN
        07.08.2017 00:23

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


  1. Gaikotsu
    05.08.2017 00:50
    -2

    Проверил пароли, которые использую уже лет 15+ — ни один не засветился.


  1. Noizefan
    05.08.2017 03:13

    Так вот, откуда нам знать, какие пароли есть у злоумышленников? Благодаря специалисту по безопасности Трою Ханту можно проверить эти базы на актуальность. Более того, их можно скачать к себе на компьютер и использовать для брутфорса чего только можно.


  1. mike_y_k
    05.08.2017 03:14

    спасибо за статью
    пока качается напишу страничку для проверки
    посмотрим как будет работать с полной базой после загрузки ;)


    1. d1f
      05.08.2017 09:20

      не надо страничку, пожалуйста!


      1. mike_y_k
        05.08.2017 19:22

        Так то локально для себя любимого, и даже на https ;), и без логов…
        Кстати хороший повод для менеджеров паролей вырваться вперёд — встроив проверку.


        1. d1f
          05.08.2017 23:36

          Всё равно не надо.


          1. mike_y_k
            07.08.2017 10:03

            Или таки de gustibus non est disputandum, или развёрнутый ответ (номинально понятный всем).


  1. shashilx
    05.08.2017 07:56
    -2

    пароли не проверял, базы скачал, глянул… а там хэши. ну и как мне эти ваши хэши скормить джону, а?! нафига мне эти ваши хэши, давайте оригинальный файл и чтоб регистрозависимый, а не приведённый в верхний реест (или не приведённый, непонятно). посоветуйте ктонить ОГРОМНЫЙ wordlist с русскими паролями в английских раскладках, я устал брутфорсить.


    1. markhor
      05.08.2017 10:17
      +2

      Цель базы не помочь вам брутфорсить, а помочь обычным людям проверять утекшие пароли без внешнего сервиса.


    1. mike_y_k
      05.08.2017 19:20

      Сделайте себе генератор паролей в любом виде и проверяйте их по той базе ;).
      Все совпавшие составят Вам тот самый список. Дальше уже на своё усмотрение :D.
      А статью таки стоило прочитать внимательнее, этот список не для того сделан.


  1. shokedjobana
    05.08.2017 14:41
    +1

    от создателей проверки пароля image


  1. McARIS74
    05.08.2017 15:44

    Шикарная статья, давно об этом думал. Ведь собирают же злоумышленники, факт!


  1. mike_y_k
    05.08.2017 19:28

    Проверка своих паролей прошла успешно. Пока не скомпрометированы.
    Надо будет добавить генерацию всех вариантов uc/lc для всех букв в пароле.
    Тогда результат станет максимально информативным, особенно если дополнения таки будут идти с хешами на оригинальном case.


  1. 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.


    1. mike_y_k
      07.08.2017 10:01

      Для проверки истинности только генератор и сравнение.
      Стоит наверное залить информацию в БД и написать скрипт для обновления.


  1. bublichek
    07.08.2017 10:08

    известная организация Cloudflare и предложила захостить файлы забесплатно

    Так мило с их стороны. Такие няшки.


  1. Jogger
    07.08.2017 19:18

    проверил несколько старых паролей, которые давно не использую, и которые 100% были слиты. В базе их не нашлось. Учитывая количество паролей в базе — довольно странно. Хотя не исключаю вариант что я попадаю под правило «неуловимого Джо».


  1. d1f
    08.08.2017 06:07

    Пока проверяется опубликованным здесь perl скриптом, никто ничего не найдёт.
    Потому что он делает двоичный поиск из предположения, что файлы хэшей отсортированы,
    а это так только для update-2.
    Самый большой файл и update-1 несортированы, я для проверки этого программу на C написал.
    Нужно делать линейный поиск, а это долго…


    1. 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);


      1. d1f
        09.08.2017 02:20

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

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

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

        А тот скрипт ни одного тестового пароля не нашёл,
        хотя 'test' и '123' в тех файлах точно есть, я уже убедился.


        1. 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.


          1. d1f
            09.08.2017 05:14

            > УМВР

            А у меня нет.

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

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

            Но со скриптом делал — тестовые пароли с командной строки ввожу,
            их ведь не жалко.


            1. Hellsy22
              09.08.2017 14:00

              Боюсь, что скрипт не предназначен для работы с командной строкой — я не хотел бы, чтобы пароли оставались в истории. Внутри скрипта есть строчка для паролей:

              my @pass = ('test', '123', '1234', '12345', 'd1f');
              

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

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


              1. d1f
                09.08.2017 14:20

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

                Кстати, я доделал свою программу на C, теперь она ищет двоичным поиском.
                mmap'ит файлы и bsearch().
                А пароли вводятся с stdin.
                Все стандартные 123… находятся, а моих паролей нет и я этим доволен.


                1. Hellsy22
                  09.08.2017 15:45

                  Читать на каждом запуске 13 гигабайт с носителя? Да еще и загонять в память? Это довольно странный ход, с учетом того, что средний поиск пароля по файлу требует чтения ~32 блоков и выполняется за пол-миллисекунды даже на моем десктопе. Впрочем, каждый развлекается как ему нравится.


                  1. d1f
                    09.08.2017 16:33

                    mmap — это не чтение/загоняние в память файла,
                    это чтение нужных страниц по обращению к адресу памяти.
                    А поскольку теперь двоичный поиск, то грузятся только те страницы,
                    в которых ключи, через которые поиск проходит, а это сильно меньше.

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

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

                    real 0m2.256s
                    user 0m0.000s
                    sys 0m0.000s


                    1. Hellsy22
                      09.08.2017 16:37

                      У меня SSD, в данном случае это, видимо, играет определяющую роль.


  1. Hellsy22
    09.08.2017 03:32

    del


  1. mike_y_k
    09.08.2017 16:42

    Все строки в двоичное представление и в базу.
    Потом и искать ничего не нужно — просто SQL запрос и дальше по результату.
    DBMS с такими объемами играючи справится.
    Ну и задел н будущее — вторым полем можно будет хранить исходную последовательность ;).
    Как собственно в оригинале и реализовано было.


    1. 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
      


      1. mike_y_k
        11.08.2017 22:17

        Ну продолжение пока в планах, может за выходные попробую.
        А там посмотрим.
        Надо попробовать без индексации и как вариант хешированный поиск в файле ;).


        1. Hellsy22
          11.08.2017 22:23

          Без индексации поиск занимает вечность. Если заменить btree на hash, то результаты в среднем такие же, но индекс занимает не 24 гигабайта, а «всего» 13.