22.05.2017 | 22:41

Łukasz

Kryptografia haseł maskowanych, czyli magia matematyki

Zastanawialiście się kiedyś, jak zapisywane w bazie jest hasło maskowane, którego być może używacie by logować się do swojego banku? Odpowiedź ma dla Was Łukasz. I uwaga, będzie trochę matematyki (na poziomie podstawówki).

Niektóre banki uznały, że przesyłanie całego hasła za każdym razem gdy logujemy się do serwisu może stwarzać pewnego ryzyko, którego nie są w stanie zaakceptować i zaimplementowały podejście zwane „hasłami maskowanymi”. Zamiast prosić o całe hasło proszą tylko o kilka konkretnych znaków z tego hasła, na przykład 5, 7 i 11. Abstrahując od plusów i minusów takiego podejścia, za implementacją haseł maskowanych stoi spory kawałek wiedzy kryptograficznej. Niekiedy spotkałem się z pytaniami czy takie hasła muszą być przechowywane w bazie w postaci odwracalnej, bo nie można po prostu policzyć skrótu kryptograficznego. Przyjrzyjmy się zatem jak teoria pozwala nam poradzić sobie z bezpieczną implementacją takich haseł. Zdradzając zakończenie: nie, hasła nie muszą być przechowywane w postaci, którą łatwo odzyskać.

Ostrzeżenie: *nigdy* nie implementuj algorytmów kryptograficznych sam w domu. Pamiętaj, aby zawsze to robić w towarzystwie kogoś kto się na tym zna, a nie na podstawie jakiegoś artykułu w internecie.

Kody nuklearne i dzielenie sekretów

Załóżmy na moment, że Polska stała się potęgą nuklearną i właśnie Ty musisz opracować sposób wydania rozkazu użycia broni atomowej. Jednym z wymagań jest, aby dwóch generałów jednocześnie potwierdziło taki rozkaz. Musisz wymyślić system, który na to pozwala. Najprostszym rozwiązaniem byłoby stworzenie losowego hasła i rozdanie każdemu z nich połowy. Wtedy pojawia się kolejny problem: jeśli obcy wywiad przechwyci jednego z generałów to zdobędzie połowę hasła i efektywnie zmniejszy to długość hasła do znalezienia o połowę. Czy istnieje lepszy system, który nawet po porwaniu jednego z generałów nie pozwoliłby zbliżyć się w żaden sposób do złamania hasła?

Z pomocą przyjdzie nam geometria, a konkretnie jedna z najbardziej podstawowych prawd w geometrii, z której korzystamy prawie codziennie. Wiemy, że dowolne dwa różne punkty na płaszczyźnie w sposób jednoznaczny wyznaczają prostą na tej płaszczyźnie. Korzystamy z tego prawie za każdym razem kiedy używamy linijki. Z lekcji matematyki wiemy, że w układzie współrzędnych każda prosta jest jednoznacznie wyznaczona przez równanie: y = ax + b. Teraz wystarczy postąpić według następującego, krótkiego, schematu.

  1. Losujemy dowolne wartości a oraz b. Inaczej mówiąc: wybieramy dowolną, losową prostą na płaszczyźnie. Wartość b będzie naszym hasłem, które „rozdzielimy”.
  2. Na wybranej prostej losujemy dwa punkty o współrzędnych oznaczonych (x1, y1) oraz (x2, y2). Każdemu z generałów dajemy po jednym punkcie.

Gotowe – teraz każdy z generałów ma jeden punkt na prostej. Gdy się razem spotkają mają dokładnie jedną prostą wyznaczoną przez te oba punkty, a hasłem jest wartość w punkcie przecięcia prostej z osią Y, czyli, inaczej mówiąc, wartość w x = 0. Załóżmy, że obcy wywiad porwał jednego z generałów. Zdobyli w ten sposób jeden punkt na prostej. Wciąż nie wiedzą nic o tej prostej, a na pewno nie gdzie przetnie oś Y, ponieważ wciąż istnieje nieskończenie wiele prostych, które przechodzą przez ten punkt. Dzięki temu, że losowo wybraliśmy wartość a, zapewniliśmy, że porwanie jednego generała nie wystarczy, aby poznać nasze kody nuklearne. Można też rozwinąć takie dzielenie w inną stronę: jeśli wymagamy, aby dowolnych dwóch z pięciu (dziesięciu, piętnastu…) generałów było w stanie wydać rozkaz użycia broni atomowej, wystarczy każdemu z nich dać inny punkt na prostej – łącznie 5 (10, 15…) różnych punktów. Wtedy dowolnych dwóch będzie mogło zrekonstruować całą prostą. Swoją drogą, skoro obcy wywiad  już drugi raz porwał generała, to może warto rozdzielić hasło pomiędzy więcej osób niż dwie? To, tradycyjnie, zostawię jako proste ćwiczenie dla czytelnika (podpowiedź brzmi: „wielomiany„).

No dobrze, ale co to ma wspólnego z hasłami maskowanymi?

Zamaskowane hasło

Załóżmy, że nasze hasło, które chcemy „zamaskować”, składa się z dowolnej, ale mniejszej niż z góry ustalona liczby znaków. Każdy z tych znaków ma, odpowiadający mu, kod ASCII, który jest zwykłą liczbą. Dodatkowo, załóżmy, że bank spyta nas o tylko dwa znaki hasła. System, przy ustalaniu hasła, tak jak w poprzednim przypadku, losuje dwie wartości – a oraz b. W bazie danych zostanie zapisana wartość b, która będzie spełniała niejako taką samą funkcję jak skrót kryptograficzny w przypadku standardowej metody przechowywania haseł. Wartość b na końcu będzie porównywać z tym co wytworzymy z podanych przez użytkownika znaków hasła. Wartość a znów zapewni nam losowość, która spowoduje, że wyciek bazy nie będzie oznaczał automatycznie wycieku haseł.

Teraz losujemy tyle różnych punktów na naszej prostej, ile użytkownik podał znaków w swoim haśle. Każdy z tych punktów ma dwie współrzędne – x oraz y. Następnie w bazie danych przechowujemy, dla każdego punktu, wartość x oraz wartość y pomniejszoną o wartość ASCII znaku, który użytkownik wprowadził w haśle. Zauważmy, że bardzo istotne jest, żeby punkty przechowywać w odpowiedniej kolejności – wszak będziemy pytać użytkownika o znak hasła na ustalonej pozycji i musimy znać punkt, który tej pozycji w haśle odpowiadał. Teraz w bazie znajduje się tyle punktów, ile użytkownik ma znaków w haśle oraz wartość b. Dodatkową informacją, która nie musi być przechowywana w bazie, ale wynika bezpośrednio z przechowanych danych jest długość hasła użytkownika. Niestety, nie da się uniknąć przechowywania tej informacji – w końcu musimy zapytać użytkownika o pozycję w haśle, która istnieje. Zauważmy też, że w przypadku niemaskowanych haseł wartość ta nie jest w żaden sposób przechowywana ani w łatwy sposób wydobywalna z bazy danych.

Po stworzeniu hasła użytkownik kiedyś będzie chciał z niego skorzystać. Wtedy losujemy dwie (jak ustaliliśmy na początku) dowolne pozycje w haśle i pytamy użytkownika o te dwa znaki. Nic nas nie ogranicza – możemy spytać o dwa naprawdę dowolne znaki. W celu weryfikacji czy podane znaki są poprawne wykonujemy następujące kroki.

  1. Do współrzędnej y punktów, które odpowiadają wylosowanym pozycjom znaków dodajemy wartości ASCII znaków podanych przez użytkownika. Musimy dodać te wartości do odpowiednich punktów, dlatego tak ważne było trzymanie ich w kolejności.
  2. Mając dwa punkty odzyskane za pomocą wejścia od użytkownika jesteśmy w stanie wyznaczyć dokładnie jedną prostą na płaszczyźnie. Teraz wystarczy policzyć gdzie ta prosta przecina oś Y (inaczej mówiąc, jaka jest jej wartość w punkcie 0).
  3. Jeśli wyliczona wartość odpowiada wartości przechowywanej w bazie danych, to użytkownik poprawie podał znaki i może korzystać z bankowości elektronicznej. Oczywiście po odpowiednim sprawdzeniu drugiego czynnika uwierzytelnienia, na przykład wartości tokena.

Zauważmy, że wartość b była wybrany w losowy, niezwiązany z hasłem, sposób. Wartości punktów są co prawda związane z hasłem (poprzez odjęcie wartości znaków), ale też są losowe.

Jeśli bank chciałby zapytać o więcej niż dwa znaki hasła to, jak poprzednio, umiejętna czytelniczka bądź światły czytelnik będą w stanie rozszerzyć podany przykład, znów za pomocą wielomianów. Dodatkowo, przedstawiony algorytm jest teorią, która nie uwzględnia elementów poprawnej implementacji i optymalizacji jak i paru innych obostrzeń. Na przykład, że są lepsze i gorsze losowe punkty na prostej oraz powinno się unikać przetwarzania wartości odpowiadających liczbom rzeczywistym, a nie całkowitym.

Warto też wspomnieć, że samo użycie haseł maskowanych jest dosyć kontrowersyjne. Jednak ich implementacja może być przeprowadzona w sposób bezpieczny, tak, że nawet wykradając bazę danych atakujący będzie miał twardy orzech do zgryzienia, jeśli będzie chciał poznać hasło. Chociaż, jak wspomnieliśmy, nawet najlepsza implementacja wycieknie odrobinę metainformacji na temat hasła, a przechwycenie chociaż jednego zapytania o znaki w haśle zmniejszy przestrzeń możliwych wartości hasła. Poza tym należy pamięć, że jeśli coś może być zaimplementowane bezpiecznie to nie oznacza, że tak jest zaimplementowane.

Powrót

Komentarze

  • 2017.05.22 23:03 Maciej

    …i nie można wkleić hasła z managera haseł :(

    Odpowiedz
    • 2017.05.22 23:53 Łukasz

      No właśnie! Zupełnie a propos tego tematu, to mam ciekawy link, niestety po angielsku: https://www.ncsc.gov.uk/blog-post/let-them-paste-passwords. Rozpowszechnij wśród znajomych!

      Odpowiedz
    • 2017.05.23 06:48 jan

      A pewnie, że można – KeePass potrafi. Trochę trudniej, ale da się.

      Odpowiedz
    • 2017.05.23 08:19 Lukasz

      Da się w oparciu o AutoType w KeePassie.
      Uzywasz opcji PICKCHARS

      Ryzyko, no wiadomo nie jest to odporne na keyloggery.

      Odpowiedz
    • 2017.05.23 08:22 Michał

      Dlaczego? Np. KeePass obsługuje maskowane hasła.

      Odpowiedz
  • 2017.05.22 23:19 WikT0R

    Fajny artykuł, człowiek całe życie się uczy i nie pozna wszystkich możliwości, tyle ich jest.

    Odpowiedz
  • 2017.05.23 00:23 Arv

    Wiem, że tu i ówdzie robi się mniej więcej tak:
    Przy ustawianiu/zmianie hasła losuje się użytkownikowi n różnych masek do hasła. Potem zapisuje w bazie n różnych skrótów typu hash(login+unmasked_letters+moar_salt). n może zależeć od długości hasła i oczekiwanego poziomu bezpieczeństwa.

    Przy logowaniu losujemy jedną z n zapisanych masek. Pytamy o niezamaskowane literki. Liczymy skrót i porównujemy z zapisanym w bazie. Jeżeli logowanie się nie zakończyło sukcesem, pytamy o uprzednio wylosowaną maskę. W przeciwnym razie atakujący mógłby odświeżać stronę do logowania aż wylosuje mu się maska na którą czeka.

    Odpowiedz
    • 2017.05.23 19:38 zakius

      zdaje się że alior właśnie coś takiego stosuje, wypytuje o jakieś 5 może 6 różnych masek i tyle

      Odpowiedz
    • 2017.05.23 23:38 Pablo_Wawa

      No tak, z tą zapamiętaną maską (nie zgadniętą) to jest dobre, ale da się to obejść – wystarczy poczekać, aż właściwy użytkownik zaloguje się do systemu z tą maską, a my potem możemy zgadywać kolejną losową.

      Odpowiedz
    • 2017.05.26 19:56 Tom

      Ale w ten sposób entropia takiego zbioru skrótów będzie rzędu n*(długość_maski) zamiast pełnej długości hasła (czyli o wiele wiele mniej). Tym sposobem zamiast np. jednego 30-znakowego hasła (niemożliwego do złamania) dostaniesz, dajmy na to, 10 pięcioznakowych „haseł”, zbruteforce’owanie których zajmie chwilę.

      Odpowiedz
  • 2017.05.23 00:32 Pepe

    A czy autor mógłby jeszcze jednak rozwinąć temat z ostatnich akapitów, bo za moment mnóstwo laików znów zacznie domagać się implementacji maskowanych haseł ;)
    Tymczasem temat już dekadę temu (o rety, to już tak dawno?) był dyskutowany i niektórzy pokusili się o ciekawe eksperymenty:

    https://wampir.mroczna-zaloga.org/archives/235-o-haslach-maskowanych.html

    https://wampir.mroczna-zaloga.org/archives/1058-hasla-maskowane-znowu.html

    Odpowiedz
  • 2017.05.23 01:33 rot

    Czy tylko mi się zdaje że mając zbiór punktów z których dokładnie znamy tylko x a y z jakąś z góry zakładaną dokładnością oraz oczekiwany punkt (0,b) czyli dane zapisane w bazie to wyznaczenie prostej która przechodzi przez (0,b) (x1,y1+h1) (x2,y2+h2) … (xn,yn+hn), nie jest żadnym problemem.

    Czyli myśląc po mojemu, mając dane z bazy wyznaczenie hasła jest trywialne, ale jest późno więc pewnie źle myślę.

    Odpowiedz
    • 2017.05.23 09:31 Łukasz

      Nie znam żadnej prostszej metody niż przeszukiwanie wszystkich możliwych wartości znaków.

      Odpowiedz
    • 2017.05.23 12:13 MSM

      Zależy w jakim ciele wykonywać obliczenia. Przy liczbach rzeczywistych są algorytmy interpolacji wielomianów faktycznie, które mniej więcej rozwiązują dokładnie ten problem.

      Ale takich rzeczy się nie robi na liczbach rzeczywistych tylko na czymś co da się przetwarzać dokładnie – np. pierścieniu modulo N, skończonych polach, albo najlepiej na krzywych eliptycznych.

      Odpowiedz
  • 2017.05.23 04:43 Duży Pies

    Dla ambitniejszych polecam książkę „Kryptografia w bazach danych. Ostatnia linia obrony” Kevina Kenana wydaną przez nieistniejące już wydawnictwo Mikom.
    Opis tu: http://lubimyczytac.pl/ksiazka/133358/kryptografia-w-bazach-danych-ostatnia-linia-obrony

    Odpowiedz
  • 2017.05.23 05:50 bronisław

    Macieju…. Można.
    KeePass obsługuje hasła maskowane.

    Odpowiedz
  • 2017.05.23 06:03 Bronisław

    Łukasz… Nie spotkałem się jeszcze z takim podejściem jak to opisane w artykule, ale sam wklejam hasła za pomocą managera haseł. W przypadkach istotnych dla mnie używam również mieszacza znaków a zatem w schowku nigdy nie ma całego hasła tylko kilka razy jego krótkie części w „losowej” kolejności.

    Odpowiedz
  • 2017.05.23 06:51 Wolf480pl

    Czyli mając dump bazy danych, jeśli bank wymaga k liter na raz, wystarczy zbruteforcować k liter hasła i obliczyć wielomian, a potem z niego można policzyć pozostałe litery hasła?

    Odpowiedz
    • 2017.05.23 09:35 Łukasz

      Tak, ale wszystkie pozostałe algorytmy o jakich słyszałem cierpią na podobny problem. Założenie jest takie, że znając k liter n-literowego hasła jesteś w stanie się zalogować do banku, czyli hasło jest skompromitowane.

      Na przykład przetrzymując hasze pewnych kombinacji znaków, jeśli złamiemy jeden hasz w czasie t, to złamanie całego hasła zajmie nam (n/k)*t, co jest tylko kilka (pewnie nawet mniej niż 5) razy dłuższym działaniem niż t. Dlatego istotne jest wybranie dosyć dużego k, co prowadzi do kolejnego problemu z hasłami maskowanymi.

      Odpowiedz
      • 2017.05.23 12:11 Miodek

        Skompromitować to się może człowiek, ale nie hasło!

        Odpowiedz
      • 2017.05.23 15:48 anadyomenel

        Ale czy w takim razie nie faworyzuje to krótkich haseł z dużą rozmaitością znaków względem równie bezpiecznych długich haseł o mniejszej rozmaitości?. Dla danego n trudniej zgadnąć n znaków z hasła typu X&j\k2 niż z correcthorsebatterystaple. Czy to jest pożądane?

        Odpowiedz
  • 2017.05.23 07:05 Michał

    Rozważam to zadanie dla czytelników i nie jestem pewny w jaki sposób jest to zrealizowane. Wielomian jest rozdzielany na dwumiany i można je później pomnożyć i mieć „hasło” albo jest to realizowane w jakiś inny sposób i ma związek z miejscami zerowymi?

    Odpowiedz
    • 2017.05.23 09:38 Łukasz

      Nic nie musisz rozdzielać. Tak jak dwa punkty jednoznacznie wyznaczają prostą, tak trzy punkty jednoznacznie wyznaczają parabolę i ogólnie n+1 punktów jednoznacznie wyznacza krzywą wielomianową stopnia n (dla n=1 jest to prosta, na n=2 parabola). Rozdzielając losowe punkty z tej krzywej pośród generałów, będziesz później potrzebował n+1 generałów, żeby odbudować krzywą.

      Odpowiedz
      • 2017.05.30 14:00 wredny

        Aby nie za szybko i na skróty podążasz?

        Twierdzisz, że dwa punkty, to prosta. Trzy punkty to parabola… No to proszę… Punkt 1-szy dostaje wartość 11, drugi wartość 17, trzeci wartość 23, czwarty wartość 29, piąty wartość 41. Sugerujesz, że jest to równanie czwartego stopnia, bo ma pięć elementów? Zmartwię Ciebie. To tylko wartości leżące na prostej o równaniu y=3x+5… Szkoda… Co ciekawsze, to może zauważysz że wartości są np. liczbami pierwszymi? Celowo takie wartości wybrałem. choć nie są to kolejne wartości wynikające z równania y=3x+5. Po prostu taką sobie maskę nałożyłem aby te punkty wybrać ze zbioru wartości funkcji y.

        Odpowiedz
  • 2017.05.23 08:53 Pyth0n

    Wedlug mojej (niepotwierdzonej) wiedzy, występuje drugi, nieco bardziej przestarzały sposób przechowywania haseł maskowanych:

    * Występują 2-3 limity pytanych znaków, wybierane na podstawie „zaufania” do komputera (typu znana przeglądarka, ze znanego IP z niewygaśniętym cookie będzie miała 5 znaków do wpisania. Jak wygaśnie cookie to 6 a jak jest to nieznana lokacja to 7)

    * Dla każdego limitu losowane są maski spełniające limit (czyli dla hasła max 16 znaków i limitów 5-6-7 losowane są wektory 16 bitowe z 5-6-7 jedynek)

    * Niektórzy zachowują wszystkie maski, niektórzy zachowują tylko część (efekt „w tym tygodniu już wpisywałem ten zestaw”)

    * Dla każdej zachowanej maski jest generowany solony hash z liter odkrytych maską.

    — Weryfikacja —

    * Pobranie ID użytkownika

    * Wybranie zestawu masek na podstawie heurystyki zaufania do połączenia i wylosowanie maski z wybranego zestawu

    * Prezentacja maskowanego pytania o hasło

    * Weryfikacja hasła z hashem pasującym do kombinacji UID-maska

    Ale model geometryczny jest dużo bardziej elegancki. Jest oczywiście też algorytm Shamira do współdzielonego sekretu (SSSA), który pewnie możnaby zastosować do haseł maskowanych.

    Pozdrawiam!

    Odpowiedz
  • 2017.05.23 09:11 Adrian

    Orzech jest twardy: „Twardy orzech do zgryzienia”, nie ciężki.

    Odpowiedz
    • 2017.05.23 09:30 Łukasz

      Dzięki! Poprawiłem.

      Odpowiedz
  • 2017.05.23 09:34 Marcin

    Hasło przechowywane w ten sposób jest bardzo proste do odtworzenia. Zgadnięcie parametru „a” umożliwi odkrycie wszystkich znaków hasła. Jego pierwsze przybliżenie można ustalić jako (yn-y1)/(xn-x1), a następnie nieznacznie zmieniać jego wartość i badać jakie wartości przyjmuje a*x+b dla x1..xn. Dla poprawnego „a” wszystkie wartości powinny być liczbami całkowitymi (pomijając błędy zaokrągleń).

    Innym sposobem jest po prostu brute force – sprawdzenie jaką wartość „a” daje każda możliwa kombinacja pierwszych dwóch znaków i czy odzyskane wartości pozostałych liter hasła są liczbami całkowitymi i trafiają w zakres 0-255. Ten sposób da się uogólnić na dowolną liczbę znaków wymaganych do podania przy logowaniu – liczba kombinacji do sprawdzenia będzie dużo mniejsza niż liczba kombinacji dla pełnego hasła.

    Odpowiedz
    • 2017.05.23 09:42 Łukasz

      Marcin, tak jak wspomniałem wyżej w komentarzach, odgadnięcie k liter (tyle ile bank od nas wymaga do zalogowania) jest tym samym co skompromitowanie całego hasła. Twoja metoda, myślę, że się zgodzisz, jest po prostu przeszukaniem w poszukiwaniu dwóch liter i potem obliczeniem z nich hasła. Dlatego k musi być dosyć duże, a wtedy cała idea maskowanego hasła bierze w łeb. Dlatego między innymi napisałem, że hasła maskowane są „kontrowersyjne”.

      Odpowiedz
      • 2017.05.23 11:32 gotar

        Odgadnięcie k liter NIE jest tym samym co skompromitowanie całego hasła, gdyż hasło samo w sobie *zazwyczaj* stanowi pewną wartość, jeżeli tylko niesie jakąś informację o metodzie jego stworzenia. A większość ludzi jednak stosuje jakiś schemat (imiona, miejsca, daty, inne osobiste bzdety). Oznacza to, iż odtwarzalność pełnego hasła na podstawie mniejszej liczby znaków naraża użytkownika takiego hasła na atak w innym miejscu.

        Oczywiście – losowe hasła z managera likwidują TO zagrożenie, jednakże nie mówimy o osobach korzystających z takich haseł; zastanowić się należy, czy instytucje typu banki nie mogłyby wprowadzić alternatywnej, niezależnej metody autoryzacji „maszynowej”, czyli hasło kilkusetznakowe (bo dla managera to żadna różnica) do logowania z bezpiecznego komputera, lub hasło maskowane do logowania „skądś”.

        Takie kilkusetznakowe hasło równie dobrze może być po prostu …sygnaturą kryptograficzną, do której część kliencką już mamy (podpis elektroniczny). Ale dla większości ludzi, którzy podpisu obecnie nie posiadają, mogłoby to pozostać jako klasyczne, choć bardzo długie, hasło.

        Ale to się nie stanie tak długo, jak podpis nie będzie w dokumencie państwowym, czyli nie stanie się powszechny. Ja mam podpis elektroniczny, a praktycznie WSZĘDZIE loguję się średniowiecznymi metodami z hasłem; co gorsza, widzę regres, bo do dwóch banków miałem sprzętowe tokeny RSA – ale zostały wycofane, w jednym banku zrezygnowano z kryptografi asymetrycznej do podpisywania zleceń (tak, 15 lat temu po prostu dostałem na dyskietce klucz prywatny do podpisywania zleceń),
        został mi jeden bank z tokenem w formie aplikacji.

        I o ile jestem w stanie zrozumieć wycofywanie się z obsługi kluczy czy certyfikatów (przejęcie jednego komputera daje dostęp do wszystkiego) i zastąpienie ich – SWEGO CZASU – SMS-ami (trzeba przejąć dwa urządzenia – komputer oraz telefon), o tyle dzisiaj, gdy nastąpił powrót do jednego urządzenia (smartphone’a), w dodatku urządzenia zazwyczaj nieaktualizowanego (miliony brandowanych androidów bez poprawek bezpieczeństwa), zastanawiam się, czy spowodowane jest to głupotą i niezrozumieniem świata przez starych bankowych ramoli, czy wręcz przeciwnie – przez młodych gniewnych 'millenialsów’ i innych drwali w rurkach, którzy poszli robić w korpo.

        Odpowiedz
        • 2017.05.23 12:26 Zajcef

          >>> I o ile jestem w stanie zrozumieć wycofywanie się z obsługi kluczy czy certyfikatów […], zastanawiam się, czy spowodowane jest to głupotą i niezrozumieniem świata przez starych bankowych ramoli, czy wręcz przeciwnie – przez młodych gniewnych ‚millenialsów’ i innych drwali w rurkach, którzy poszli robić w korpo.

          Kompletnie nietrafiony trop z wiekiem. Eksperci technologiczni w korpo-bankach są zwykle w wieku 35+, ale to nie oni podejmują decyzje biznesowe, jedynie rekomendują rozwiązania. Decyzje podejmuje zarząd. A zarządy wszystkich korpo są takie same, mają swoje priorytety – i ryzyko technologiczne wcale nie jest na pierwszym miejscu.

          Odpowiedz
        • 2017.05.23 12:28 MSM

          Kilkaset znaków hasła nie ma sensu. Przy charsecie a-zA-Z0-9 21 znaków (128 bitów) to więcej niż ktokolwiek będzie kiedykolwiek potrzebował. 42 znaki (256 bitów) jeśli ktoś lubi overkill/paranoję.

          (co do reszty posta generalnie racja)

          Odpowiedz
  • 2017.05.23 10:19 fpo

    Jest mowa o tym, że w artykuje będzie trochę matematyki, a tu już na wstępie zdanie, które jest prawdziwe dla haseł 2-znakowych nad alfabetem binarnym…

    „Wtedy pojawia się kolejny problem: jeśli obcy wywiad przechwyci jednego z generałów to zdobędzie połowę hasła i cała przestrzeń możliwych haseł zmniejszy się o połowę.”

    Odpowiedz
    • 2017.05.23 10:53 Łukasz

      Dzięki, poprawione!

      Odpowiedz
  • 2017.05.23 12:24 Zdzich

    Co do systemu dotyczacego broni jadrowej czy nie lepiej aby general A zaszyfrowal wiadomosc i podpisal wydal rozkaz przeslal do generał B a tamten nacisnął czerwony guzik?

    Odpowiedz
    • 2017.05.23 12:46 Dominik

      Wtedy B może sobie poradzić sam, bez generała A.

      Odpowiedz
  • 2017.05.23 12:39 Igor

    Nie zgadzam się z treścią ostrzeżenia – niby dlaczego ktoś ma nie implementować algorytmów kryptograficznych? Jedyne obostrzenie tutaj powinno brzmieć „nigdy nie wykorzystuj w praktyce algorytmów kryptograficznych, które sam zaprojektowałeś”.

    Odpowiedz
    • 2017.05.23 17:51 Adam

      W procesie implementacji także łatwo popełnić błąd. Po co wymyślać od nowa sprawdzone rozwiązania narażając się na wyższe ryzyko? Zero korzyści.

      Odpowiedz
      • 2017.05.29 10:18 Tomek

        A mi się wydaje, że każdy kto pisze „Po co wymyślać od nowa sprawdzone rozwiązania” pracuje dla rządu, który ma te rozwiązania rozpracowane i boi się, że ktoś wymyśli coś nowego, czego nie będą potrafić rozszyfrować.

        Odpowiedz
  • 2017.05.23 12:42 :P

    W dzieleniu tajemnic ciekawe jest zastosowanie protokołu Blakleya w wielowymiarowej przestrzeni. Wyobrazić sobie tego nie sposób, ale matematycznie jest to proste do policzenia :)

    Odpowiedz
    • 2017.05.23 13:02 :P

      Dokładniej n podprzestrzeni o kowymiarze 1 w n-wymiarowej przestrzeni wyznacza dokładnie jeden punkt. Przydało by się dodać warunki, bo bez nich NIE WOLNO nawet myśleć o dzieleniu sekretów.

      Odpowiedz
  • 2017.05.23 21:55 alxjns

    tldr: end user experience haseł maskowanych jest ich dużym czynnikiem ryzyka

    Podstawowa wada haseł maskowanych o której nikt tu nie pisze jest natury „ergonomicznej”. Prowadziłem kiedyś warsztaty o szeroko i humanistycznie rozumianym „interfejsie” człowiek-technologia, hasła maskowane wypłynęły ze strony uczestników jako przykład technologii „plecami do ludu”.

    Mianowicie w trakcie logowania niektórzy użytkownicy czują się zmuszeni zapisać „tymczasowo” hasło (lub część) na kartce żeby policzyć pozycje znaków, albo wypowiadają pod nosem licząc na palcach. Szczególnie jeśli logowanie im „nie wychodzi” i frustrują się liczeniem w pamięci, nie mają czasu albo boją się zablokowania po kilku nieudanych próbach. Jeśli zastosowali i zapamiętali niesłownikowe i długie hasło jest jeszcze trudniej policzyć pozycje w pamięci, co naturalnie promuje używanie krótkich haseł słownikowych.

    Powyższe zachowania stwarzają oczywiste ryzyko. Sam to widziałem kilka razy na własne oczy u różnych osób, szczególnie starszych.

    Zanim ktoś napisze, że user notujący hasło na kartce jest głupi i sam sobie winien, niech weźmie pod uwagę, że obowiązkiem projektującego i wdrażającego takie systemy jest pamiętać o różnych grupach odbiorców.

    Ten sam user za fachową namową z gazety już wymyślił i zapamiętał być może długie i skomplikowane hasło, chce dbać o swoje bezpieczeństwo, a technologia logowania nakłania go do popełnienia błędu.

    Może się to czytelnikom specjalistycznego portalu IT wydać śmieszne (lub nawet niezwykłe) ale większość internautów ma problemy ze sprawnym liczeniem i „widzeniem” w pamięci. Dodam, że nie ma to związku z poziomem intelektualnym użytkownika.

    Odpowiedz
    • 2017.05.23 23:49 Klaudiusz

      Widzenie w pamięci hasła? To ja jestem nie jeden, ale dwa rzędy słabszy w świadomości o niektórych swoich hasłach. Ja nie potrafiłbym ich nawet wymówić albo zapisać długopisem. Mam je zapisane w pamięci mięśniowej, czyli jeśli mam klawiaturę to je wpiszę. Nie pamiętam ich jednak, a przynajmniej nie w taki sposób, by je wymówić…

      Odpowiedz
      • 2017.05.24 17:56 zakius

        i ty tym bardziej maskowanego nie wpiszesz
        eh, mam kilka takich haseł, nad którymi na telefonie siedzę długie minuty…

        Odpowiedz
  • 2017.05.23 22:24 Vava

    Przedstawiona metoda nie chroni w wypadku wycieku bazy, co więcej, im dłuższe hasło, tym łatwiej będzie je poznać, ale nawet bez poznania mając dane z bazy możemy się zalogować.

    Na początku nawet myślałem, że można przyjąć założenie, że hasło będzie się składać z drukowalnych znaków dostępnych bezpośrednio z klawiatury, ale nie jest to potrzebne.

    Bierzemy pierwszy punkt z bazy (X1, Z1) oraz punkt (0,b).
    W pętli bierzemy kolejne kody ASCII (C1=00..255) wyliczamy.
    Mając dwa punkty ((0,b),(X1,Y1))otrzymujemy 256 wartości Y1=b-Z1, a dla nich A=(Y1+C1)/X1.
    Dla każdej z otrzymanych wartości A bierzemy w drugiej pętli kolejne punkty hasła i dla każdego n-tego punktu wyliczamy wartość Yn=An*Xn+b, a z niej wartość kodu znaku hasła Cn=Yn-Zn.

    Mamy 256 haseł, z nich odrzucamy te, których choćby jeden z wyliczonych znaków nie jest wartością całkowitą z zakresu 0..255.

    Z dużym prawdopodobieństwem zostaniemy z tylko jednym hasłem
    Ale nawet jeśli zostaniemy z 256-cioma hasłami to teraz możemy spróbować odsiać jeszcze trochę biorąc założenie o drukowalnych, prostych do wpisania z klawiatury (np. smartfonu) znakach.

    Ale co najciekawsze, to jest nam potrzebne tylko w wypadku, jeśli tego hasła chcielibyśmy użyć do innych celów (typu atak na konto mailowe/społecznościowe)…

    …Albowiem, KAŻDEGO z tak wyliczonych haseł będzie można użyć do zalogowania się przez metodę maskowaną.

    Innymi słowy, algorytm przedtawiony w artykule kompletnie nie chroni przed wyciekiem danych z bazy.

    Metoda wielomianowa nic nie poprawia, tylko tyle, że haseł nadających się do zalogowania się będzie więcej, a napisanie skryptu łamiącego będzie wymagało od hakera nieco większej wiedzy matematycznej (albo umiejętności skorzystania z serwisu http://www.wolframalpha.com), jednak złożoność obliczeniowa będzie na tyle mała, że nie powinno być konieczności wykupywania abonamentu na wyższe limity czasu procesora per zapytanie na wolframie.

    Odpowiedz
  • 2017.05.23 22:48 Bartek

    Zarówno tak stworzone hasła jak i tradycyjnie przechowywane (funkcja skrótu + sól) da się Brute Forcowac w przypadku kradzieży bazy danych. Pytanie jest które będzie łatwiej złamać (mniejszy nakład czasu i mocy obliczeniowej potrzebny) oraz jaki będzie ich koszt podczas procesu uwierzytelniania. (dajcie whitepaper jeśli jest)

    Odpowiedz
  • 2017.05.24 12:19 PP

    Mniej więcej kumam. A czy może ktoś napisać, dlaczego wielokrotne stosowanie hashowania (np. md5) „osłabia” hasła trzymane w tej postaci w bazie? Przed atakiem słownikowym (ze skrótami md5) atakujący nie poradzi sobie, nie wiedząc że w bazie trzymane jest np. podwójne md5 (czyli md5(md5(hasło_niezakodowane))).

    Odpowiedz
    • 2017.05.25 09:07 gosc

      A dlaczego ma nie wiedzieć? Przecież jak kradł bazę to „obok” był kod (serwara) korzystający z tej bazy. Ma nie ukraść przy okazji kodu? Wątpię. Mając kod wystarczy rzucić okiem i już widać metodę implementacji skrótu.

      Odpowiedz
  • 2017.05.24 12:26 szlovak

    Teoria teorią, ale hasła maskowane próbują udoskonalić zwykłe hasło. Mając odpowiednia liczbę podsłuchanych haseł i to nawet bez zrzutów ekranu , myślę że w zależności od losowości hasła hasło będzie skompromitowane po powiedzmy 20 razach . Jeśli ktoś ma loggera to nic mu nie pomoże , chyba że na konto wchodzi rzadko. Więc wtedy zebranie odpowiedniej ilości kombinacji masek może zająć kilka miesięcy nawet, jest to lepsze niż nic, ale jak będzie słabe hasło to po kilu podejrzeniach można je zgadnąć. Jedyna metoda to mieć klucz prywatny w postaci klucza np. USB, które to urządzenie tylko odpowiada na zapytanie z banku w momencie jak się naciśnie przycisk na tym kluczu. Oczywiście szyfrowanie asymetryczne, koncepcja banalna, skuteczność niesamowita. Wtedy można sobie podglądać i logować co się komu podoba, bo zawsze zapytanie z banku jest losowe.

    Odpowiedz
    • 2017.05.25 23:55 Pepe

      @szlovak:
      > Teoria teorią, ale hasła maskowane próbują udoskonalić
      > zwykłe hasło. Mając odpowiednia liczbę podsłuchanych
      > haseł i to nawet bez zrzutów ekranu , myślę że w zależności
      > od losowości hasła hasło będzie skompromitowane po powiedzmy
      > 20 razach.

      otóż dużo szybciej będzie skompromitowane – bo nie trzeba kompromitować całego – żeby skorzystać, potrzebujesz tylko część hasła, bo przecież jest maskowane, zatem wystarczy jak piszesz cierpliwie notować, ale też możesz mieć szczęście i okaże się, że to co masz zanotowane wystarczy Ci zanim skompletujesz całość :)
      ładnie to opisuje tutaj już dekadę temu jeden taki:
      https://wampir.mroczna-zaloga.org/archives/235-o-haslach-maskowanych.html
      https://wampir.mroczna-zaloga.org/archives/1058-hasla-maskowane-znowu.html

      Odpowiedz
  • 2017.05.24 15:55 Qba

    Tak się zastanawiam odnośnie kodów nukleranych dla większej ilości osób niż 2. Z tego co pamiętam, to znajdowanie rozwiązań dla wielomianów stopnia większego niż 4 wcale nie jest trywialne. Czymś, co mi jako pierwsze przyszło do głowy i wydawało się najbardziej natualne, to uogólnienie rozumowania na przestrzenie n-wymiarowe. Dla 3 na przykład losujemy punkty, które wyznaczają nam jakąś płaszczyznę a rozwiązaniem jest jej przecięcie z płaszczyzną xy.
    Czy mógłby autor skomentować i wyjaśnić? :)

    Odpowiedz
  • 2017.05.25 09:02 gosc

    Argumentacja z generalami i „zblizaniem” się do klucza jest typowym przykładem by na siłę uzasadniać użycie tak na prawdę nikomu niepotrzebnego algorytmu. Tak jest nie tylko w kryptografi ale w innych dzidzinach np. wymyślanie nikomu niepotrzebnego nowego języka programowania. Wymyśla się uzadnienia potrzeby jego użycia (nikomu niepotrzebne).
    Jeśli generalowi przejmie się jego hasło/klucz wcale nie usprawiedliwia sensowności zabawy z maskowaniem skoro:
    a) z powodzeniem używa się kluczy pojedynczych bez ich rozdzielania o odpowiedniej długości zapewniających bezpieczeństwo
    b) gdy potrzeba rozdzielić klucz wystarczy uwzględniajac pkt a) wydłużyć klucz 2x. Mimo poznania połowy klucza nadal reszta jest bezpieczna.
    c) ilu do tej pory zostało porwanych genrałów w celu wykradzenia ich (części) kodów? Zgaduję, że 0.

    Odpowiedz
    • 2017.05.25 10:29 Qba

      Jeżeli tak uważasz, to polecam postudiować trochę historię matematyki i przyjrzeć się na przykład koncepcji liczb zespolonych ;).

      ad b. Wydłużenie klucza nie zadziała, jeżeli chciałbyś aby za pomocą tylko części z puli przypisanych kodów można było wyznaczyć cały klucz.

      ad c. Ty tak na poważnie?

      Odpowiedz
      • 2017.05.25 23:51 gosc

        Now popadajmy w skarjnosc, l.z. to dosc przydatne narzędzie matematyczne w inżynierii (szczególnie w elektrotechnice).
        ad b) a po co z części przypisanych kodów wyznaczać cały klucz? Jak widać metoda maskowania oprócz rozwiązania problemu dzielenia wprowadza nowe problemy.
        ad c) jak najbardziej. Proszę o statystki porwanych generałów. Wiele rozwiązań opartych jest o wydumane założenia, które nigdy nie będą miały miejsca, a jeśli będą to w zupełnie innym scenariuszu niż się zakłada.

        Odpowiedz
        • 2017.05.26 13:42 Qba

          Liczby zespolone powstały jako czysto abstrakcyjna idea matematyczna, o której w tamtych czasach można było powiedzieć, że jest to wymyślanie jakichś „nikomu nie potrzebnych” dziwactw oderwanych od świata rzeczywistego. Wraz z rozwojem koncepcji okazało się, że z ich zadziwiających właściwości można wyprowadzić mnóstwo narzędzi matematycznych, nieosiągalnych w inny sposób, bez których technologia którą mamy dzisiaj nie wyglądała by tak jak wygląda.

          ab b. Mieszasz dwie kwestie. Opisanie kodów atomowych, jak rozumiem, jest wstępem do dalszej części artykułu. Nie jest to koncepcja powstała do tego, żeby wprowadzić hasła maskowane, ale niezależna rzecz.

          ab c. Myślisz że takie statystyki mogą zobaczyć ludzie nie posiadający dostępu do dokumentów z napisem „ściśle tajne”?

          Odpowiedz
  • 2020.03.27 01:59 robmar

    W przykładzie z generałami warto zapewnić, żeby x1 i x2 nie były zerowe. To oczywiste i drobiazg, ale życie uczy, że właśnie o drobiazgach się zapomina…

    Odpowiedz

Zostaw odpowiedź do zakius

Jeśli chcesz zwrócić uwagę na literówkę lub inny błąd techniczny, zapraszamy do formularza kontaktowego. Reagujemy równie szybko.

Kryptografia haseł maskowanych, czyli magia matematyki

Komentarze