Трябва ви уеб хостинг? Разгледайте предложенията на ICDSoft.

Web hosting from ICDSoft.

Това не е платена реклама. Безплатна е. Макак така безплатна? Защо?

Харесвам собственика на тази фирма, той ползва част от печалбата ѝ за редица благотворителни инициативи.

Допълнително разтягане на ключове

Разтягането на ключове (англ. 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 бита на дума, ако думата е взета от книга (а ако е избрана популярна сентенция, поговорка, заглавие на песен - оценката трябва да се занижи още).

Подробно писах в тази статия: Избиране на силна парола - няколко идеи

Коментари

Финансовите услуги и червената лента

Да спрем банковия и картовия лобизъм

Знаеш ли какви промени в законите ти готвят? Готов ли си да се подчиняваш на господарите си?

Ново! От 2023 година! Нашите законотворци (които изобщо не взимат пари за писане на закони) пак пишат промени в закон по много подозрителен начин. Промените са "скрити" в края на проект за закон, в заглавието на който се твърди, че ще се изменя ДОПК. Обаче се оказва, че това не е съвсем така - променят се и други закони...

Опитват да вкарат промени, които само до преди месеци не успяха! Дали този път ще успеят да гласуват в интерес на тесен кръг лица?

Демокрацията работи само ако гражданите се интересуват какви закони смятат да се гласуват в Народното събрание. Също така, за да работи демокрацията, се налага и народните представители да са наясно с това, което гласуват.

Да спрем банковия лобизъм!

Популярни статии

Проблемът с амплитудно модулираната светлина и ползването на широчинно-импулсна модулация за регулиране на яркостта на светлинни източници

За вредата от озонаторите и йонизаторите на въздух

Снимане на публични и обществени места - правни аспекти

Ремонт на печка духалка (ремонтирана преди това неправилно от неизвестен майстор)

По-лоша частна пощенска услуга от Български пощи? Запознайте се с услугата „пощенско писмо“ на Еконт

Политиците пак заговориха, че щели да създават работни места

Данък върху финансовите транзакции

Блогове

Още, още блогове

Още блогове

Всички публикации в блога (цъкни тук за да се отвори архива)

Показване на още