Pytanie:
Czy osłabiam symetryczne szyfrowanie OpenPGP, wdrażając niestandardową pre-derywację?
Paranoid GPG
2016-03-14 02:49:48 UTC
view on stackexchange narkive permalink

Często używam GnuPG do szyfrowania plików za pomocą hasła. Jestem bardzo paranoikiem i obawiam się, że wyprowadzanie klucza używane przez GnuPG nie jest wystarczająco wolne.

Z tego powodu zdecydowałem się przeprowadzić własne wyprowadzenie klucza przed wprowadzeniem hasła do GnuPG.

Mam skrypt Pythona, który uruchamia 10 milionów rund PBKDF2-SHA512 ze statyczną solą i wyświetla wynik zakodowany szesnastkowo. Nazywam to „pre derywacją”.

Najpierw uruchamiam to z hasłem i przekazuję jego wynik do GnuPG jako pośrednie hasło.

Czy jestem na właściwej ścieżce, czy jestem Marnuję na to czas, a co gorsza, osłabiam bezpieczeństwo szyfrowania?

* „Nie ufam dobrze znanemu narzędziu zabezpieczającemu, więc piszę własne” * - Zwykle jest to * naprawdę * zły pomysł.
Dwa odpowiedzi:
Jens Erat
2016-03-14 03:19:45 UTC
view on stackexchange narkive permalink

Pomijając fakt, i tak lepiej nie wdrażać niestandardowego kodu kryptograficznego, odkrywasz na nowo koło. Funkcjonalność OpenPGP string-to-key jest konfigurowalna i może być dostosowana do twoich potrzeb, nie tracąc przy tym kompatybilności. Nie omawiam tutaj twoich wyborów w liczbie cykli, chociaż wydają się one trochę surowe. Polecam przeczytanie W którym momencie dodanie większej liczby iteracji do PBKDF2 nie zapewnia dodatkowego bezpieczeństwa? na ten temat.

Z man gpg :

--s2k-cipher-algo name

Użyj nazwy jako algorytmu szyfrującego do szyfrowania symetrycznego z hasłem, jeśli nie podano --personal-cipher-preferences i --cipher-algo . Wartość domyślna to AES-128.

--s2k-digest-algo name

Użyj nazwy jako używanego algorytmu podsumowania aby zmienić hasła w celu szyfrowania symetrycznego. Wartość domyślna to SHA-1.

--s2k-mode n

Określa sposób manipulowania hasłami do szyfrowania symetrycznego. Jeśli n wynosi 0, zostanie użyte zwykłe hasło (które nie jest ogólnie zalecane), 1 dodaje sól (która nie powinna być używana) do hasła, a 3 (domyślne) iteruje cały proces kilka razy ( zobacz --s2k-count ).

--s2k-count n

Określ ile razy hasła manipulujące przy szyfrowaniu symetrycznym są powtarzane. Ta wartość może wynosić od 1024 do 65011712 włącznie. Wartość domyślna jest pytana z gpg-agent. Zwróć uwagę, że nie wszystkie wartości z zakresu 1024-65011712 są prawidłowe i jeśli zostanie wybrana niedozwolona wartość, GnuPG zaokrągli w górę do najbliższej dozwolonej wartości. Ta opcja ma znaczenie tylko wtedy, gdy --s2k-mode jest ustawiony na wartość domyślną 3.

Na koniec następujące opcje będą miały ten sam efekt:

  gpg --s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 10000000 --symmetric

--s2k-mode 3 jest domyślnym ustawieniem GnuPG (i jedynym rozsądnym ustawieniem tej opcji); Nie włączyłem --s2k-cipher-algo , ponieważ nie jest to istotne dla wyprowadzania klucza (i nie jest obsługiwane przez opisaną przez Ciebie „pre-derywację”). Alternatywnie możesz ustawić tę opcję jako domyślną w swoim gpg.conf:

  s2k-mode 3s2k-digest-algo SHA512s2k-count 10000000  

Te opcje mogą być używane nie tylko do symetrycznego szyfrowania wiadomości / plików, ale są również używane do ochrony kluczy prywatnych za pomocą hasła.

Próbowałem zmodyfikować liczbę s2k, ale nawet przy 10 milionach nadal kończy się prawie natychmiast. pbkdf zajmuje wiele sekund na moim komputerze.
@ParanoidGPG, Może to wynikać z faktu, że Python nie jest optymalnym wyborem dla kodu krytycznego dla wydajności (takiego jak ten)
Aby dodać do tego, co napisał @SEJPM, napastnik, który ma wystarczające fundusze, aby brutalnie wymusić twoje hasło, nie będzie na tyle głupi, aby uruchomić powolną implementację KDF w Pythonie, ale zamiast tego uruchomi zoptymalizowaną wersję. KDF, który * powolny dla ciebie * nie jest pomocny; bycie wolnym jest pomocne tylko wtedy, gdy * niemożliwe jest * w pewnym sensie *.
Neil Smithline
2016-03-14 03:27:45 UTC
view on stackexchange narkive permalink

Chociaż ochrona hasła jest najważniejszą częścią zapewniającą bezpieczeństwo GPG, istnieje prawdopodobieństwo, że osłabiasz istniejące zabezpieczenia zamiast je wzmacniać.

Bardzo ważne jest, aby spróbować zminimalizować czas, w którym hasło znajduje się w pamięci komputera. Jestem pewien, że GPG odpowiednio zeruje pamięć, aby zminimalizować ekspozycję. Ale języki zarządzane przez pamięć, takie jak Python, tak naprawdę nie ułatwiają bezpiecznej manipulacji na ciągach. Oznacza to, że Twoje początkowe hasło, a także to, które przekazujesz do GPG, prawdopodobnie pozostanie w pamięci wirtualnej komputera (przeczytaj je jako na dysku). Prawdopodobieństwo, że zostanie to wydobyte, jest przedmiotem dyskusji, ale z pewnością jest to dużo większe niż czas, w którym GPG pozostawi twój klucz leżący w pobliżu.

Nie wspominasz też o tym, jak zasilasz hash SHA512 w GPG. Jeśli drukujesz, a może nawet kopiujesz i wklejasz do GPG, byłoby to okropne. (Bufory kopiowania nigdy nie powinny być używane do tajnych danych).

Dlatego zalecam korzystanie z istniejących opcji GPG (zobacz odpowiedź @ JenErat, aby uzyskać doskonały przegląd) i spróbuj zapamiętać że nie powinieneś tworzyć własnego krypto.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...