Допълнително разтягане на ключове
Разтягането на ключове (англ. key stretching) е добра допълнителна защита срещу отгатване на паролата (англ. brute force attack), но много от популярните програми не прилагат това правилно или изобщо нямат такава функция.
Идеята е, че ако се ползва „бавна“ (изискваща процесорно време и памет) хеш функция (за преобразуване на паролата в ключ), това ще затрудни опитващите се да ви отгатнат паролата – за всеки опит да отгатнат паролата ще трябва да плащат за изчислителни ресурси.
Практически пример: стартирате скрипта slowkdf.py, пишете за парола "коректен кон батерия телбод", въвеждате сол (примерно "vhtLXCqhvOJif0TLhh2Wjn392t" или просто "сол"), задавате достатъчно голям брой итерации (примерно 40) и след няколко минути (или часове – зависи колко сте готови да платите за сигурността си) скриптът за разтягане на ключове извежда нещо такова:
s9FzZqyWRly8qoQ5UN2dd5mQVYYfNVChHWHLiVy1T8nXjFbdbQUwk/pDz6ou7WKO/6NVXuT3oq3E0GjcQAS1zw==
Този низ го ползвате като парола за шифриране на нещата, които не искате другите да виждат (например това може да е паролата, с която е защитен частния ви PGP ключ).
Тоест, трябва да помните паролата и къде сте записали солта и броя на итерациите. Трябва да съхранявате и копие от скрипта.
Установих, че GnuPG не предлага адекватно разтягане на ключове както при шифриране на файлове с парола, така и за защита на частния ключ с парола.
#!/usr/bin/python2 import scrypt import binascii import getpass from hashlib import sha512 def SlowKDF(password, salt, i): digest = password for counter in range(i): print "Iteration %s from %s..." % (counter+1, i) digest = scrypt.hash(digest, salt, N = 1048576, r = 8, p = 1, buflen = 128) return digest mypass = getpass.getpass("Passphrase: ") if mypass != getpass.getpass("Repeat passphrase: "): print "ERROR: Passwords do not match." quit() if mypass != getpass.getpass("Repeat passphrase (again): "): print "ERROR: Passphrases do not match." quit() mysalt = raw_input("Salt: ") mynumber = int(input("Number of iterations: ")) mydigest = SlowKDF(mypass, mysalt, mynumber) print "\n == Version 1 ==" print "\n\nDigest in hex format:", binascii.b2a_hex(mydigest) print "\n\nDigest in base64 format:", binascii.b2a_base64(mydigest) print "\n == Version 2 ==" mydigest_v2 = sha512(mypass+mysalt+mydigest).digest() print "\n\nVersion 2 digest in hex format:", binascii.b2a_hex(mydigest_v2) print "\n\nVersion 2 digest in base64 format:", binascii.b2a_base64(mydigest_v2) print "\n == Version 1+2 ==" mydigest_v1plus2=mydigest+mydigest_v2 print "\n\nVersion 1+2 digest in hex format:", binascii.b2a_hex(mydigest_v1plus2) print "\n\nVersion 1+2 digest in base64 format:", binascii.b2a_base64(mydigest_v1plus2)
Преди да се ползва този скрипт трябва да се инсталира scrypt:
$ pip install --user scrypt
Преди да пуснете скрипта имайте предвид, че изисква да имате поне 1 GB (един гигабайт!) свободна оперативна памет. Ако нямате толкова системата може да блокира. Това не е бъг, нарочно се изисква токова много памет. Целта е да се откажат крадците на данни, които искат да минат тънко (със суперкомпютър с малко RAM).
Github: SlowKDF
Скриптът вади няколко версии за ключ като най-практичната е "Version 2 digest in base64 format".
Разликата между версия 1 и 2 е, че при втората съм добавил за всеки случай sha512 – изчислява се sha512(ключа+солта+версия_1). Версия 1+2 се подразбира от името какво е (плюсът значи конкатенация).
Ако ви притеснява това, че версия 2 е по-къса – просто ползвайте версия 1+2 (ако програмата, която ползвате ви позволява толкова дълги пароли; ако ли не – режете докато се събере в лимита и помнете/запишете колко сте отрязали).
Любителите на шапките с фолио вероятно ще предпочетат да ползват "Version 1+2 digest in base64 format", но тя работи само с GnuPG версия 1 (версия 2 има ограничение на броя символи на паролата!). Ако слагате шапка от фолио и на котката – значи вероятно ще ви хареса идеята да въвеждате и допълнителна парола (конкатенация на "Version 1+2 digest in base64 format" и допълнителна парола).
Ако се чудите защо слагат фолио и на котките: котката може да е видяла как въвеждате паролата и без шапка от фолио могат да я програмират безжично да се обади по телефона и да каже паролата на някого.
Бърз тест да проверите дали програмата за шифриране, която ползвате има адекватно разтягане на ключове: ако вади отговор "грешна парола" (при опит за дешифриране) за части от секундата – значи програмата е калпава. Ако ѝ трябва минута или повече – добра е.
А не може ли да се ползва scrypt от https://www.tarsnap.com/scrypt.html?
Да, знам за scrypt. Обаче тази програма ползва само алгоритъма scrypt, доколкото разбрах (моят скрипт, версия на digest-а 2, ползва допълнително sha512).
И не е удобна ако просто искаш да си разтеглиш ключа за защита на частния PGP ключ. И ако забравиш да зададеш достатъчно силни параметри за време и памет ще ползва несигурни настройки по подразбиране. И не ми харесва как като задам време 10 секунди програмата смята значително по-кратко.
Ако все пак предпочитате да я ползвате, задавайте свои собствени настройки като добавите достатъчно големи стойности на параметрите "-M" и "-t" (не ползвайте тези по подразбиране):
$ scrypt enc -M 1073741824 -t 256 разни-тайни-неща.txt шифрирани-тайни.scrypt
Ще забележите, че изисква доста по-малко от 256 секунди в действителност (поне на моя компютър е така).
Две съществени разлики между KeePassX и KeePass2. (TLDR: Първата – алгоритъмът за разтягане на ключове е имплементиран неефективно при KeePass2. Втората – KeePass2 записва файла на базата толкова бавно, колкото бавно го отваря (докато KeePassX го записва светкавично). )
Допълнение: KeePassXC поддържа алгоритъма Argon2, може да се зададат по-тежки настройки.
Колко ентропия съдържа една дума?
Ако сте избрали думата случайно - зависи от размера на речника и колко е добър генератора на случайни числа.
Не се подвеждайте по числа като 11,82 бита на дума (които ще намерите, ако потърсите повърхностно по темата), реалистично е да се очаква около 5 бита на дума, ако думата е взета от книга (а ако е избрана популярна сентенция, поговорка, заглавие на песен - оценката трябва да се занижи още).
Подробно писах в тази статия: Избиране на силна парола - няколко идеи
Коментари
Публикуване на коментар