PINy, hasła – less is more

Będzie o PINach, a ogólniej o hasłach, bo PIN to specyficzny rodzaj hasła. Less is more to w tym przypadku mniej ograniczeń przekładających się na większe bezpieczeństwo. Zaczęło się od wpisu na Twitterze gdzie pokazano ograniczenia nakładane na PIN w pewnej aplikacji.

Zastanowiło mnie, czy da się policzyć o ile takie ograniczenia zmniejszą bezpieczeństwo, rozumiane jako przestrzeń możliwych poprawnych kombinacji PINu.

Na wstępie widać, że pierwsza cyfra PINu musi być inna niż 0 oraz 1. Już sam ten warunek zmniejsza przestrzeń poprawnych PINów o 20%. I to niezależnie od długości PINu.

Tu moja matematyka wysiada i sięgam po symulacje. Skrypt w Pythonie, który sprawdza wszystkie czterocyfrowe kombinacje i podaje, czy PIN jest poprawny (True) czy błędny (False) może wyglądać tak:

def is_valid(a, b, c, d):
    if a < 2:
        return False
    if ((a - b) == (b - c) or (b - c) == (c - d)):
        return False
    if (a == b) or (b == c) or (c == d):
        return False
    if ((b - a > 0) and (c - b > 0) and ((d - c > 0)) or (b - a < 0) and (c - b < 0) and (d - c < 0)):
        return False
    return True


for a1 in range(0, 10):
    for a2 in range(0, 10):
        for a3 in range(0, 10):
            for a4 in range(0, 10):
                result = is_valid(a1, a2, a3, a4)
                print(a1, a2, a3, a4, result)
python piny.py | grep -c True
5120

Jak widać, dla PINów o czterech cyfrach, wprowadzone ograniczenia zmniejszają przestrzeń dozwolonych PINów aż o niemal połowę.

Po co te ograniczenia i jak to zrobić poprawnie?

I teraz o motywacji. Jestem pewnien, że była ona szczytna i chodziło o podniesienie bezpieczeństwa. Jestem prawie pewien, że twórcy chodziło o wyeliminowanie prostych, schematycznych PINów. 0000, 1111, 1234 itp. Jak widać, w praktyce konsekwencje były dalej idące.

Najlepiej biorąc pod uwagę statystyki najczęściej występujących PINów i tworząc krótką listę PINów zabronionych. Wg statystyk PIN 1234 odpowiada za ponad 10% wystąpień wśród używanych PINów. 20 najczęściej używanych PINów jest używanych w 26% przypadków. Taka lista podniesie bezpieczeństwo, rozumiane jako „wymuszenie mało popularnego PINu” równie skutecznie, co proponowane ograniczenia. Zaś bezpieczeństwo rozumiane jako „ilość możliwych kombinacji” zostanie zmniejszone jedynie minimalnie.

Przypadki brzegowe

Jeśli przypuszczamy, że nasi klienci mają znacząco różne preferencje niż te z powyższych statystyk, robi się trudniej. W ogólności najlepiej walidować hasła na obecność zabronionych ciągów już w momencie ustalania hasła przez użytkownika. Zabronić można nazwy firmy, zasobu do którego jest chroniony dostęp, roku, czy popularnych ciągów znaków.

Jeśli jednak tego nie zrobiliśmy zawczasu, nadal nie wszystko stracone, choć robi się nieco ślisko. Nie znamy przecież PINów, co najwyżej mamy dostęp do hashy, więc ciężko będzie określić, których używają nasi klienci. Na ratunek przychodzi hashcat. Niezależnie od użytej funkcji hashującej, brute force krótkich PINów trwa moment. Jeśli korzystamy z bezpiecznych, wolno liczonych hashy, a użytkowników jest wielu, nie ma potrzeby robienia brute force wszystkich. Wystarczy analiza próbki statystycznej. Oczywiście taki audyt to operacja bardzo delikatna, więc nie zabieramy się za to bez stosownych umocowań i zachowania właściwej higieny.

UPDATE: Wersja uogólniona skryptu poniżej. Ilość cyfr w PIN regulowana ilością powtórzeń alfabetu w funkcji product. Dla dłuższych PINów warto skorzystać z pypy, które potrafi być szybsze.

import itertools
alphabet = list(range(0, 10))

def is_valid(i):
    if i[0] < 2:
        return False

    for n in range(0, len(i)-2):
        if i[n] - i[n+1] == i[n+1] - i[n+2]:
            return False

    for n in range(0, len(i)-1):
        if i[n] == i[n+1]:
            return False

    monotonic = True
    for n in range(0, len(i)-2):
        if (i[n] - i[n+1]) * (i[n+1] - i[n+2]) < 0:
            return True
    if monotonic:
        return False

    return True

for i in itertools.product(alphabet, alphabet, alphabet, alphabet):
    result = is_valid(i)
    print(i, result)

Płomień i krzyż

Jakiś czas temu skusiłem się na Empik Premium. Co prawda z cashback Empik się wycofał, ale nadal uważam, że w sumie warto, bo głównie o dostęp do audiobooków w ramach Empik Go mi chodziło. W każdym razie 50 zł[1] za rok wydawało się niewygórowane. I choć mam wrażenie, że na początku dostępnych było więcej tytułów, to nadal uważam, że to fajna opcja.

W każdym razie szukałem jakiegoś audiobooka do posłuchania na Empik Go. Jakoś padło na Płomień i krzyż autorstwa Jacka Piekary. Niczego tego autora nie znałem, choć nazwisko kojarzyłem. Polska fantastyka, ilość tytułów, ocena w okolicy 4 i do tego opowiadania nie nastrajały zbyt optymistycznie. Jednak stwierdziłem, że dam szansę. Pozytywne zaskoczenie: lekko się czyta (słucha!), ciekawy pomysł i na dobrą sprawę, z uwagi na powiązania, spokojnie można uznać te niby opowiadania za kolejne rozdziały powieści.

Disclaimer po rozmowie ze znajomymi: nie zwracałbym większej uwagi na krótkie opisy traktujące o alternatywnej historii w religii. Tzn. to jak najbardziej ma miejsce, ale – przynajmniej z tego co dotychczas czytałem – jest bardziej tłem zdarzeń, nie ich osią.

Jestem po lekturze tomu pierwszego[2] i wyrażam umiarkowany zachwyt. Intryga zgrabnie się rozwija, jeśli w kolejnych tomach będzie utrzymany poziom, to gdzie jest serial, ja się pytam? Bo z tego co do tej pory poznałem, to aż się prosi o ekranizację.

I jeszcze taka zabawna sytuacja. W polu wyszukiwania w Empik Go wpisałem płomień i krzyż, wybrałem tom drugi z podpowiedzi, zatwierdziłem wyszukanie i ujrzałem coś takiego:

Wyszukanie płomień i krzyż tom 2 w Empik Go - screenshot
Wyszukiwanie tomu II w Empik Go, smartfon Android

Pytania konkursowe (nagród nie przewiduję, ale konkurs może być, prawda?):

  1. Co kryją poszczególne pozycje?
  2. Którą z pozycji należy wybrać, aby otworzyć wyszukiwany tom 2?
  3. Co się stanie po zmianie położenia smartfona z prezentowanego na poziome?

Rozwiązanie za jakiś tydzień w formie aktualizacji wpisu. Podpowiem tylko, że kto w IT pracuje, ten w cyrku się nie śmieje.

UPDATE Pora na nieco spóźnione rozwiązanie zagadki.

  1. Są to kolejne trzy tomy cyklu. Skoro wyszukuję tom 2 to pewnie jestem zainteresowany także 1 i 3. Logiczne.
  2. Nie wiem. Trzeba próbować. Ale jest pozytyw: po powrocie pozycje się nie zmieniają, więc czekają nas najwyżej trzy próby.
  3. Nic. Skoro se user przechyla smartfona, to chce oglądać ekran bokiem, a ustawienia systemowe kłamią. Oczywiste.

[1] Świta mi, że wtedy było 40 zł. Nieistotne w sumie, historii płatności sprawdzać nie będę.
[2] Przynajmniej wg Biblionetki bo wg Wikipedii wygląda nieco inaczej. W każdym razie niczego nie brakuje i wszystko się spina.

Zdalna rewolucja

Zastanawiam się ostatnio nad skutkami pandemii i mam wrażenie, że długofalowo najbardziej pamiętną lub też istotną rzeczą nie będzie liczba ofiar, postęp medycyny, tylko… praca zdalna, a w zasadzie zmiana podejścia do niej. Już na początku pandemii żartowano, że dopiero teraz widać, ile spotkań mogło być zastąpionych mailem.

Praca zdalna nie była oczywiście nowością, szczególnie w IT. To co się jednak zmieniło to jej powszechność. Na skutek lockdownu wszystkie firmy dostosowały infrastrukturę i narzędzia. Jak ktoś nie miał VPN dla pracowników w firmie, oferującego dostęp do zasobów firmowych, to szybko go uruchamiał. Jak ktoś miał zdalny dostęp, ale za słaby, by obsłużyć wszystkich pracowników – rozbudowywał infrastrukturę.

Dostosowano także kulturę pracy. Ludzie szybko nauczyli się korzystać z narzędzi do pracy zdalnej, a także pewnego savoir vivre. Nie generuj szumu zbędnego szumu – jeśli masz głośno w domu, to wyciszaj mikrofon, gdy nie mówisz. Zadbaj o przyzwoite tło do rozmowy, jeśli nie masz możliwości w realu, to użyj wirtualnego tła. Miło, jeśli na spotkaniu
mamy włączone kamery, o ile warunki techniczne pozwalają, bo nie gada się do ściany. Proste. Spotkania co prawda nie zniknęły, ale zmieniły się w videokonferencje. Zresztą, już przed pandemią spotkania międzyfirmowe często tak wyglądały. Teraz po prostu jest to naturalne. Zaleta jest taka, że wszyscy mają przyzwoity sprzęt audio.

Duża w tym zasługa rozwoju aplikacji. Usprawnienia, optymalizacje i zabezpieczenia pojawiały się jak grzyby po deszczu. W każdym razie nawet jeśli aplikacje początkowo miały jakieś zgrzyty, to najdalej po paru miesiącach zostały one poprawione. Mam też wrażenie, że w przypadku spotkań miedzyfirmowych łatwiej o wybór sensownej platformy. Większość z nich ma teraz wersje webowe.

Efekt jest taki, że obecnie praktycznie wszyscy w szeroko pojętym IT są gotowi do pracy zdalnej. Zresztą nie tylko w IT. Jest infrastruktura, są procedury, jest kultura pracy, są przygotowani pracownicy. Część firm już się określiła jak będzie wyglądać praca w przyszłości. Część, jak Google, dostosowuje się do nowych warunków, zmieniając zasady wynagrodzeń. Inni zauważają pewne niekorzystne zjawiska przypisywane pracy zdalnej. Osobiście uważam, że raczej wynikają one z ogólnej izolacji, a nie tylko izolacji między pracownikami.

Z pozytywów – praca zdalna spowodowała, że zniknęła masa większych i mniejszych problemów. Zniknęły ryzyka ze zdarzeniami losowymi w trakcie dojazdu, które mogły powodować spóźnienia. Nie ma problemu, że w danym pomieszczeniu jeden pracownik marznie, a drugi w tym samym czasie się poci. Problem ze skupieniem lub przerywaniem pracy można łatwo wyeliminować, w przeciwieństwie do pracy na miejscu w biurze. Jak nigdy widać, że praca to czynność, nie miejsce[1].

W każdym razie z punktu widzenia pracowników nagle okazało się, że można mieszkać na łonie natury, a zarabiać jak w Warszawie. O ile ograniczymy się do Polski, co wcale nie jest oczywiste. W dodatku pracując efektywniej lub bardziej komfortowo. Zresztą nawet ci, którzy mieszkają w miastach odkryli, że zamiast tłuc się dwa razy dziennie godzinę komunikacją miejską w tłoku albo stać w korkach, można ten czas spędzić przyjemniej. Wykonując dokładnie tę samą pracę, za dokładnie te same pieniądze. Czyli z 8h płatnej pracy plus 2h niepłatnego dojazdu zostało 8h płatnej pracy. Taka podwyżka 20%, patrząc na efektywną stawkę godzinową[2].

Z punktu widzenia pracodawcy okazuje się, że dostępni są pracownicy z całego kraju. Albo i świata, jeśli w firmie „urzędowy” jest angielski. Nie trzeba ograniczać się do miasta, w którym jest siedziba firmy. Okazuje się też, że niektóre firmy, wbrew oczekiwaniom pracowników, nie chcą korzystać z zalet pracy zdalnej i zapowiadają powrót do biur, co może stwarzać na rynku okazję do łatwiejszego pozyskania pracowników. Tym bardziej, że część pracowników może już de facto mieszkać gdzie indziej, niż na początku pandemii.

Zastanawiam się, jak i kiedy się to wszystko skończy. Pytania to, czy przy zdalnej pracy stawki powinny być w danej firmie zależne czy też niezależne od miejsca (kraju!) zamieszkania są otwarte. Jest potencjał na wprowadzenie pojęcia dyskryminacji płacowej ze względu na miejsce zamieszkania. Bo dlaczego niby pracownik mieszkający gdzieś na wiosce miałby za tę samą pracę otrzymywać niższe wynagrodzenie, niż ten, który mieszka w centrum dużego miasta? Z drugiej strony, czemu np. mieszkania w dużych miastach miałyby być droższe? Albo – patrząc w drugą stronę – poza dużymi miastami tańsze? Oczywiście nie wszyscy mogą pracować zdalnie, ale nadal w niektórych rejonach udział tych, którzy mogą, jest znaczny.

Tak czy inaczej, zmiany są nieuniknione, a walka z nimi przypomina zawracanie kijem Wisły. Portale pośrednictwa pracy zaczęły oferować lokalizację „zdalna”.

[1] Zastanawiałem się, gdzie to usłyszałem. Co prawda nie udało mi się ustalić, ale pozwolę sobie podlinkować pierwszy wynik wyszukania po tej frazie, bo ładnie opisuje zalety pracy zdalnej i warto przeczytać ten krótki wpis.
[2] Zakładając, że wszystkie godziny pracy są równej wartości, rodzaj wykonywanej pracy nie ma znaczenia i biorąc pod uwagę tylko czas. W praktyce, ze względu na koszt krańcowy czasu pracy, monotonię/nudę przejazdu i dodatkowe koszty zysk pracownika jest w praktyce większy.