Spam przez telefon

Witamy w XXI w., witamy w roku 2020! Tematem będzie telefoniczny spam. Przygoda z dziś, świeżutka. Zadzwonił telefon, służbowy. Już po numerze wiedziałem, że reklama[1], ale – mimo, że akurat miałem spotkanie w firmie – odebrałem posłuchać, cóż to za garnki czy inna prezentacja tym razem. Zresztą szybciej odebrać niż ma mi brzęczeć, albo zadzwonić za chwilę drugi raz.

Powitał mnie wyluzowany, optymistyczny i lekko entuzjastyczny głos telemarketera, który zaczął coś o wypoczynku. Ten typ, co to słysząc go wiesz, że ciężko będzie przerwać i powiedzieć, że nie jesteś zainteresowany.

Oczywiście nie byłem zainteresowany, ale fart chciał, że coś nam jakby przerwało, nim zdążyłem wyrazić brak zainteresowania. W słuchawce zrobiło się na moment głucho. Wystarczająco, by rozmówca to zauważył, powiedział, że chyba coś przerwało i wrócił. Chyba znowu przerwało, powiedziałem „halo?” i… rozmówca zaczął jakby od początku ostatniego zdania. Ten sam ton, ta sama treść.

No cóż, monotonna praca, wystudiowany układ, czyta ze skryptu. Aż przykro słuchać jak się człowiek marnuje odczytując spam. Tylko, że powiedziałem „halo?” raz jeszcze i… sytuacja się dokładnie powtórzyła. Znowu identyczny tekst, identyczna intonacja. Nabrałem podejrzeń, zacząłem mówić „halo?” i… po paru próbach miałem pewność. To nie człowiek, tylko automat.

Taki nietrywialny, z podpiętym rozpoznawaniem mowy i rozbudowanym skryptem. Słowo kluczowe „halo?” powodowało powrót na początek akapitu. Po dojściu do odpowiedniego momentu chciał potwierdzić, że chodzi o województwo wielkopolskie i ewidentnie czekał na input od użytkownika.

W każdym razie wygląda, że kolejny zawód, w tym przypadku telemarketera, przejmują komputery i sztuczna inteligencja. Zresztą, czytanie przez automaty staje się coraz popularniejsze. Ostatnio prezentację Piotra Koniecznego (tak, tego z niebezpiecznik.pl) na Infoshare także czytał syntezator i nawet nieźle to wychodziło, poza lekko irytującym akcentem. Może będzie o tym wpis, jak się pobawię.

Niemniej co innego synteza mowy z tekstu czyli text to speech, a co innego rozpoznawanie mowy osoby do której się dzwoni czyli speech recognition. Być może nie tylko z prostym skryptem, ale sztuczną inteligencją. W każdym razie następnym razem gdy zadzwoni do was telemarketer, polecam poświecenie chwili na zabawę i przeprowadzenie testu Turinga.

[1] Polecam poczytać opisy, także sąsiednich numerów. Zresztą cała numeracja zaczynająca się od tych sześciu cyfr jest znana i „lubiana”.

UPDATE W rozmowie z czytelnikiem otrzymałem link do wykopu, gdzie jest dokładnie ta sama rozmowa, tylko „czytana” przez „kobietę”. Co zabawne, nabijają się ze słabej inteligencji „telemarketera”. Ach, gdyby wiedzieli, że to nie człowiek…
Zresztą czytam komentarze i nawet już ktoś o tym pisał w komentarzach osiem miesięcy temu. Niestety, użytkownicy Wykopu nie uwierzyli.

Owsianka DIY

W zeszłym roku pisałem o owsiance proteinowej i zwykłej, a także o tym, że mi pasują i myślę o wersji DIY. Od czasu pandemii owsianki wróciły do łask, a nawet stały się regularnym elementem poranków. No i w końcu, głównie z racji redukcji ilości śmieci, ale też wygody, przeszedłem na wersję DIY. Niewiele ma ona wspólnego z oryginałem, ale… mi pasuje.

Owsianka DIY jest prosta, robiona na oko i podatna na modyfikacje, więc dane orientacyjnie. Przepis w sumie trochę w ramach inspiracji, trochę dla pamięci, a trochę będzie to eksperyment z polecaniem produktów na Allegro[1].

Baza owsianki:

  1. Musli. Tak naprawdę dowolne. Najtańsze z Biedronki się sprawdza. Chodzi o to, żeby były jakieś urozmaicenia, typu rodzynki, inne płatki itp., a nie tylko płatki owsiane. Około 33% objętości bazy.
  2. Płatki owsiane górskie. Np. takie, choć kupuję w sklepie stacjonarnym. Około 66% objętości bazy.
  3. Owoce liofilizowane. Mi najbardziej pasuje czarna porzeczka, bliżej oryginału byłaby malina, można też spróbować truskawki.

Teraz przygotowanie pojedynczego kubka/porcji:

  1. Około 12 łyżeczek bazy.
  2. 1-2 łyżeczki kaszki Bobovita. Najlepiej bezmlecznej, na przykład takiej, chociaż smak i rodzaj są raczej drugorzędne. Chodzi o zmianę konsystencji i wchłonięcie ew. nadmiaru wody, zwłaszcza przy wersji bez dodatku białka. Dodatkowo dobrze wpływa na rozdrobnienie białka.
  3. 20 g (1 miarka) białka WPC. O ile ma być wersja proteinowa. Ja zwykle dodaję, i wtedy jedna łyżeczka kaszki, zamiast dwóch.
  4. Można dodać ziarno słonecznika. Odkąd używam musli, raczej pomijam.

Zamieszać dokładnie suche składniki owsianki, zalać gorącą wodą nieco ponad poziom suchej masy, zamieszać dokładnie już z wodą, poczekać aż się wchłonie (można dodatkowo zamieszać w trakcie).

[1] W ramach dostępnego od niedawna programu Allegro Polecam. Jeśli kupisz coś wchodząc z linków we wpisie, to być może wpadnie mi parę groszy na owsiankę. Pewnie za jakiś czas, jeśli nie zapomnę, dam znać jak to wypadło, choć nie mam złudzeń.

Dlaczego k-anonimowość nie jest dobra przy hasłach?

Na z3s.pl pojawił się artykuł o tym, czym jest k-anonimowość. Jest to dobry artykuł i warto go przeczytać przed lekturą tego wpisu. Nie zgadzam się jedynie z tezą, że w przypadku haseł jest to bezpieczna metoda sprawdzania. Napisałem komentarz, ale pewnie nie wszyscy czytelnicy bloga tam trafią. Ponieważ bawię się z bazą hashy z HIBP i planuję wkrótce wpis na ten temat, uznałem, że jest dobra okazja do wstępu.

Moja teza jest taka, że w przypadku haseł k-anonimowość wcale nie jest taka bezpieczna, jak jest to przedstawiane. Zgodnie z artykułem obecnie dla hashy z bazy HIBP pierwsze 5 znaków występuje od 381 do 584. Czyli podczas sprawdzenia strona trzecia nie poznaje ani hasła, ani jego pełnego hasha. Przekazywane jest jedynie pierwszych 5 znaków hasha, czyli – tu moja interpretacja – ma jedynie 1/381 do 1/584 prawdopodobieństwo, że zna właściwy hash.

Gdyby przyjąć, że strona trzecia jest złośliwa, warto też przyjąć, że jest inteligentna. Czyli zamiast prawdopodobieństwa zwykłego użyje prawdopodobieństwa ważonego, uwzględniając ilość wystąpień danego hasha. Dla przykładu z artykułu na z3s.pl i hasła P@ssw0rd mamy zwracanych 543 różnych hashy:

curl -s https://api.pwnedpasswords.com/range/21BD1 | wc -l

Natomiast suma wystąpień wszystkich hashy w momencie pisania tego wpisu wynosi 60808.

curl -s https://api.pwnedpasswords.com/range/21BD1 | awk -F ":" '{sum += $2} END {print sum}'

Nasz hash wystąpił 52579 razy. Znając zwyczaje ludzi dotyczące haseł i stosując prawdopodobieństwo ważone uzyskujemy 86% szansę na to, że chodzi o hash należący do hasła P@ssw0rd. Pewności nie ma, ale z 1/543 czyli z ~0,18% robi się 86%, czyli jakieś 467 razy więcej. Ups!

Oczywiście nie znamy tu samego hasła. Znamy jedynie – a i to jedynie ze sporym prawdopodobieństwem – jego hash. O tym, że to niekoniecznie jest problem, może będzie w którymś kolejnym wpisie.

W każdym razie gdybym był serwisem, to bałbym się odpytywać serwis trzeci o hashe haseł moich użytkowników. Użytkowników podejrzewam o proste, słownikowe hasła, jakiś serwis trzeci. Zwłaszcza jeśli ten serwis ma/może mieć także inne informacje, które pozwalają mu ustalić kto pyta o hasło. Tak właśnie może być w przypadku Cloudflare, który może dostawać część ruchu od użytkownika w ramach CDN, DNS lub DoH. Prosta korelacja czasowa może w tym przypadku prowadzić do powiązania hasha hasła z IP użytkownika. Jeśli chcemy sprawdzać hasła, to lepszym rozwiązaniem jest stworzenie lokalnej kopii bazy którą pobierzemy z HIBP.

Co nie znaczy oczywiście, że k-anonimowość ogólnie nie spełnia swojego zadania. Po prostu mam wrażenie, że akurat w przypadku hashy hasła i tej konkretnej implementacji nie jest tak bezpieczna, jak jest to przedstawiane.

Warto też zauważyć, że hasło z którym mamy tu do czynienia jest proste/populare. Dla innych pięcioznakowych początków hashy wystąpienia mogą rozkładać się inaczej, bez tak silnego wskazania na konkretny hash.

UPDATE Tak naprawdę nie ma potrzeby używania całej bazy hashy i ilości ich wystąpień z HIBP (>20GB). Najczęściej występujące 100 tys. hashy to raptem 3,2 MB. Najczęstszy milion – 32 MB.