morfizm (morfizm) wrote,
morfizm
morfizm

ЖЖ пароли и вообще security

Тут ходят новости, что "выложена в открытый доступ" база данных с ЖЖ паролями за 2017. Я не знаю, что это значит, и правда ли это, но призываю к благоразумию - ни в коем случае не вводите свои логины и/или пароли в сервисы в стиле "узнать, есть ли мой логин в утёкшей базе". Потому что если вы его ввели, то "теперь есть" :) Причём в более дорогостоящей базе - базе "живых, активных пользователей". Если вы хотите проверить, есть ли вы в базе, скачайте всю базу себе локально, и уже в ней ищите. Ну или просто поменяйте пароль, раз в два года менять - вполне себе норм практика.

Кстати, хэшики утёкших паролей за прошлый год можно скачать целиком локально:
https://haveibeenpwned.com/Passwords

Попробую это сделать вечерком.
Вот так проверяем, есть ли там ваш пароль:
grep -i ^`echo -n "password" | sha1sum | awk '{ print $1 }'` /mnt/d/pwned-passwords-sha1-ordered-by-hash-v5.txt

Upd.: наваял двоичный поиск по текстовому файлу на петончеге (python3 CheckPwned.py passwords.txt database.txt):
--- 8< ---
import argparse
import hashlib

parser = argparse.ArgumentParser(description='Searches passwords in https://haveibeenpwned.com/Passwords database.')
parser.add_argument('passwords', metavar='TEST', type=str, help='text file with passwords to test, one per line, utf-8')
parser.add_argument('database', metavar='DATABASE', type=str, help='the downloaded text file with sha-1:count')
args = parser.parse_args()

def search(f: object, pattern: str) -> str:

    def search(left, right: int) -> str:
        if left >= right:
            return None

        middle = (left + right) // 2
        if middle == 0:
            f.seek(0, 0)
            test = f.readline()
        else:
            f.seek(middle - 1, 0)
            _ = f.readline()
            test = f.readline()

        if test.upper().startswith(pattern):
            return test
        elif left == middle:
             return None
        elif pattern < test:
            return search(left, middle)
        else:
            return search(middle, right)

    f.seek(0, 2)
    return search(0, f.tell())

fsource = open(args.passwords)
fdatabase = open(args.database)
source_lines = fsource.readlines()
for l in source_lines:
    line = l.strip()
    hash_object = hashlib.sha1(line.encode("utf-8"))
    pattern = hash_object.hexdigest().upper()
    print("%s:%s" % (line, str(search(fdatabase, pattern)).strip()))
fsource.close()
fdatabase.close()
--- 8< ---
Tags: lj, ликбез
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 38 comments