Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если вы глупы бесстрашны, то на той же странице можете ввести свой уникальный пароль и проверить его на наличие в базах, не скачивая их. Трой Хант обещает, что никак не будет использовать ваш пароль и его сервис абсолютно надёжен. «Не отправляйте свой активно используемый пароль ни на какой сервис — только на этот!», — убедительно заявляется на странице.
Do not send any password you actively use to a third-party service — even this one!
Не отправляйте свой активно используемый пароль ни на какой сервис — только на этот!
получилось 306 259 512 уникальных паролей. На следующий день он добавил ещё 13 675 934, опять из неизвестного источника — эти пароли распространяются отдельным файлом.alizar
echo -n СВОЙПАРОЛЬ |sha1sum
curl -X "POST" "http://заройте-ваши-данные-заройте-в-землю-тут/post" -d 'сервис:логин:пароль'
dfiles.ru
Среднее время скачивания в обычном режиме: 2321 минута
Да вы смеётесь.
#!/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;
}
позволяет искать сразу много паролей, и в разных регистрах.
Аналог вашего скрипта (тот же алгоритм) на питоне.
pwned-pass-fast.py
известная организация Cloudflare и предложила захостить файлы забесплатно
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
my @pass = ('test', '123', '1234', '12345', 'd1f');
...
# perl finder.pl
test FOUND
123 FOUND
1234 FOUND
12345 FOUND
d1f FOUNDmy @pass = ('test', '123', '1234', '12345', 'd1f');
my @pass = @ARGV;
for my $data (@pass) {
на for my $data (@ARGV) {
# \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
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:3533661echo -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]}'
Опубликована база с 320 млн уникальных паролей (5,5 ГБ)