Hasła - wartości testowe
Hasła, które rejestracja i logowanie czytają inaczej: ucięte po 72 bajtach, przycięte, policzone źle. 17 wartości, każda z tym, co psuje, i z tym, co zamiast tego robi poprawna aplikacja.
Wpisuj je po jednej skrótem AltShiftN
w palecie albo weź wszystkie do skryptu poleceniem nkb emit passwords.
Krok 1: rejestracja z 72 literami a i cyfrą 1
passwords/bcrypt-cut-registerpołowa 1 z 2 Dwa hasła różniące się po 72. bajcie
- 73 grafemy
- 73 punkty kodowe
- 73 bajty
- 73 jednostki UTF-16
- Co psuje
- Krok 1 testu 72 bajtów: załóż nowe konto z tym hasłem o długości 73 bajtów. Nowsze biblioteki, takie jak Go x/crypto, Spring Security i bcrypt 5 dla Pythona, odmawiają go, a aplikacja, która tego nie obsłuży, pokazuje stronę błędu już tutaj.
- Co robi poprawna aplikacja
- Konto założone albo odmowa z komunikatem, który podaje limit długości.
Krok 2: logowanie z 72 literami a i cyfrą 2
passwords/bcrypt-cut-loginpołowa 2 z 2 Dwa hasła różniące się po 72. bajcie
- 73 grafemy
- 73 punkty kodowe
- 73 bajty
- 73 jednostki UTF-16
- Co psuje
- Krok 2: zaloguj się do konta z kroku 1 tym hasłem, które różni się tylko 73. bajtem. Hash bcrypt, który czyta tylko pierwsze 72 bajty, jak w PHP, BCrypt.Net, jBCrypt, bcryptjs i pgcrypto, nie odróżni tych dwóch haseł.
- Co robi poprawna aplikacja
- Logowanie odrzucone, bo to nie jest hasło, z którym konto założono.
Krok 1: rejestracja z 36 polskimi literami i cyfrą 1
passwords/bytes-not-chars-registerpołowa 1 z 2 Dwa polskie hasła różniące się po 72. bajcie
- 37 grafemów
- 37 punktów kodowych
- 73 bajty
- 37 jednostek UTF-16
- Co psuje
- Krok 1 tego samego testu po polsku: 37 znaków, czyli mniej niż każdy limit liczony w znakach, i 73 bajty w UTF-8, bo każde ł zajmuje dwa bajty.
- Co robi poprawna aplikacja
- Konto założone.
Krok 2: logowanie z 36 polskimi literami i cyfrą 2
passwords/bytes-not-chars-loginpołowa 2 z 2 Dwa polskie hasła różniące się po 72. bajcie
- 37 grafemów
- 37 punktów kodowych
- 73 bajty
- 37 jednostek UTF-16
- Co psuje
- Krok 2: zaloguj się tym hasłem, które różni się tylko ostatnim znakiem. Limit 64 albo 72 znaków nie powstrzyma hasha, który czyta 72 bajty, przed ucięciem hasła.
- Co robi poprawna aplikacja
- Logowanie odrzucone.
Krok 1: rejestracja z hasłem zakończonym spacją
passwords/trailing-space-registerpołowa 1 z 2 Hasło ze spacją na końcu i bez niej
- kończy się spacją
- 15 grafemów
- 15 punktów kodowych
- 15 bajtów
- 15 jednostek UTF-16
- Co psuje
- Krok 1 testu przycinania: załóż konto z hasłem, które kończy się spacją. Warstwa, która przycina dane, zapisze hasło bez niej.
- Co robi poprawna aplikacja
- Konto założone, a spacja została częścią hasła.
Krok 2: logowanie tym samym hasłem bez spacji
passwords/trailing-space-loginpołowa 2 z 2 Hasło ze spacją na końcu i bez niej
- 14 grafemów
- 14 punktów kodowych
- 14 bajtów
- 14 jednostek UTF-16
- Co psuje
- Krok 2: zaloguj się hasłem z kroku 1 bez końcowej spacji, potem jeszcze raz ze spacją. Rejestracja i logowanie, które przycinają inaczej, wpuszczą tylko jednym z nich.
- Co robi poprawna aplikacja
- Konto otwiera tylko hasło ze spacją albo oba, bo obie strony przycinają.
Krok 1: rejestracja ze złożonymi polskimi literami
passwords/nfc-nfd-registerpołowa 1 z 2 Postać złożona i rozłożona tego samego hasła
- 9 grafemów
- 9 punktów kodowych
- 13 bajtów
- 9 jednostek UTF-16
- Co psuje
- Krok 1 testu normalizacji: załóż konto z hasłem, w którym polskie litery są pojedynczymi znakami, czyli w postaci, jaką wpisuje klawiatura.
- Co robi poprawna aplikacja
- Konto założone.
Krok 2: logowanie tymi samymi literami w postaci rozłożonej
passwords/nfc-nfd-loginpołowa 2 z 2 Postać złożona i rozłożona tego samego hasła
- 9 grafemów
- 12 punktów kodowych
- 16 bajtów
- 12 jednostek UTF-16
- Co psuje
- Krok 2: zaloguj się tym samym słowem zapisanym jako litery podstawowe z akcentami łączonymi. Wygląda identycznie, a biblioteki haszujące biorą bajty tak, jak są, więc wpuści tylko aplikacja, która normalizuje hasło.
- Co robi poprawna aplikacja
- Logowanie udane, bo hasło jest normalizowane do NFC przed haszowaniem.
Szesnaście spacji
passwords/spaces-only- zaczyna się spacją
- kończy się spacją
- 16 grafemów
- 16 punktów kodowych
- 16 bajtów
- 16 jednostek UTF-16
- Co psuje
- Spełnia minimalną długość 8, 12 albo 15 znaków i nie zawiera niczego, co da się zapamiętać. Warstwa, która przycina dane, robi z niego puste hasło.
- Co robi poprawna aplikacja
- Odmowa z podanym powodem albo przyjęte i zachowane dokładnie, nigdy przycięte do pustego hasła.
Cztery emoji klucza
passwords/emoji-four- 4 grafemy
- 4 punkty kodowe
- 16 bajtów
- 8 jednostek UTF-16
- Co psuje
- Cztery znaki, które String.length w JavaScripcie, .NET i Javie liczy jako osiem, bo każdy zajmuje dwie jednostki UTF-16, podczas gdy Python, PostgreSQL i NIST SP 800-63B liczą cztery. Strona i serwer napisane w różnych językach nie zgadzają się co do minimalnej długości.
- Co robi poprawna aplikacja
- Policzone jako cztery znaki na stronie i na serwerze oraz przyjęte albo odrzucone tak samo po obu stronach.
Fraza z 64 znaków ze spacjami
passwords/passphrase-64- 64 grafemy
- 64 punkty kodowe
- 64 bajty
- 64 jednostki UTF-16
- Co psuje
- NIST SP 800-63B zaleca przyjmowanie co najmniej 64 znaków i spacji, a formularz z maxlength 20 albo 32 albo z zakazem spacji odrzuca frazę, jaką użytkownikom radzi się wybierać.
- Co robi poprawna aplikacja
- Przyjęta w całości, a ta sama fraza otwiera potem konto.
Popularne hasło, które spełnia zwykłe reguły
passwords/composition-ok- 10 grafemów
- 10 punktów kodowych
- 10 bajtów
- 10 jednostek UTF-16
- Co psuje
- Ma wielką literę, cyfrę i symbol, więc przechodzi zwykłe reguły złożoności, a w liście wyciekłych haseł Pwned Passwords występuje ponad 500 000 razy.
- Co robi poprawna aplikacja
- Odrzucone jako popularne albo wyciekłe hasło, z podanym powodem.
Ścieżka po klawiaturze, która spełnia zwykłe reguły
passwords/breached-but-valid- 10 grafemów
- 10 punktów kodowych
- 10 bajtów
- 10 jednostek UTF-16
- Co psuje
- Wzór z klawiatury z wielką literą, cyframi i symbolem: przechodzi reguły złożoności, a w liście Pwned Passwords występuje ponad 150 000 razy.
- Co robi poprawna aplikacja
- Odrzucone jako popularne albo wyciekłe hasło, z podanym powodem.
Hasło ze 100 znaków
passwords/login-maxlength- 100 grafemów
- 100 punktów kodowych
- 100 bajtów
- 100 jednostek UTF-16
- Co psuje
- Rejestracja przyjmuje 100 znaków, a pole logowania ma mniejsze maxlength, często 64, więc przeglądarka po cichu odrzuca resztę i użytkownik nigdy się nie zaloguje.
- Co robi poprawna aplikacja
- To samo hasło działa w formularzu rejestracji, logowania i zmiany hasła albo wszystkie trzy odrzucają je z tym samym podanym limitem.
Hasło cyrylicą
passwords/cyrillic- 9 grafemów
- 9 punktów kodowych
- 15 bajtów
- 9 jednostek UTF-16
- Co psuje
- NIST SP 800-63B zaleca przyjmowanie znaków Unicode. Reguła, która dopuszcza tylko ASCII, odrzuca hasło, albo rejestracja je przyjmuje, a starsza warstwa w kodowaniu jednobajtowym zapisuje coś innego.
- Co robi poprawna aplikacja
- Przyjęte, a to samo hasło otwiera potem konto.
Hasło z nawiasami ostrymi
passwords/angle-bracket- 12 grafemów
- 12 punktów kodowych
- 12 bajtów
- 12 jednostek UTF-16
- Co psuje
- Walidacja żądań w ASP.NET na .NET Framework odrzuca wartość formularza ze znakiem mniejszości przed literą, więc poprawne hasło kończy się na stronie błędu.
- Co robi poprawna aplikacja
- Przyjęte jak każdy inny drukowalny znak ASCII.
Hasło z plusem i znakiem procentu
passwords/plus-and-percent- 11 grafemów
- 11 punktów kodowych
- 11 bajtów
- 11 jednostek UTF-16
- Co psuje
- W treści formularza plus znaczy spację, a %41 literę A. Klient, który składa treść ręcznie bez kodowania, wysyła Pa ssA-42, więc strona i ten klient zapisują różne hasła.
- Co robi poprawna aplikacja
- Zapisane i sprawdzane dokładnie tak, jak wpisane, w każdym kliencie.
Pary
Każda para to dwie wartości z listy wyżej, które warto wpisać obok siebie: w dwa pola albo dwa razy w jedno pole. Skrót AltShiftN wpisuje je po kolei, a paleta mówi, która połowa pary jest następna.
Dwa hasła różniące się po 72. bajcie
passwords/bcrypt-cutpołowa 1 z 2 Krok 1: rejestracja z 72 literami a i cyfrą 1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1- 73 grafemy
- 73 punkty kodowe
- 73 bajty
- 73 jednostki UTF-16
połowa 2 z 2 Krok 2: logowanie z 72 literami a i cyfrą 2
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2- 73 grafemy
- 73 punkty kodowe
- 73 bajty
- 73 jednostki UTF-16
- Co psuje
- Krok 3 testu 72 bajtów: jeśli drugie hasło otworzyło konto, system haszuje tylko pierwsze 72 bajty i konto otwierają dwa różne hasła. Strona błędu w kroku 1 znaczy, że biblioteka odmawia długich haseł, a aplikacja tego nie obsługuje.
- Co robi poprawna aplikacja
- Logowanie drugim hasłem odrzucone, a rejestracja pierwszym przyjęta albo odrzucona z podanym limitem.
Dwa polskie hasła różniące się po 72. bajcie
passwords/bytes-not-charspołowa 1 z 2 Krok 1: rejestracja z 36 polskimi literami i cyfrą 1
łłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłł1- 37 grafemów
- 37 punktów kodowych
- 73 bajty
- 37 jednostek UTF-16
połowa 2 z 2 Krok 2: logowanie z 36 polskimi literami i cyfrą 2
łłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłł2- 37 grafemów
- 37 punktów kodowych
- 73 bajty
- 37 jednostek UTF-16
- Co psuje
- Krok 3: jeśli drugie hasło otworzyło konto, sprawdzenie długości liczy znaki, a hash liczy bajty, więc hasło po polsku, cyrylicą albo po chińsku jest ucinane dużo wcześniej, niż sugeruje jego długość.
- Co robi poprawna aplikacja
- Logowanie drugim hasłem odrzucone.
Hasło ze spacją na końcu i bez niej
passwords/trailing-spacepołowa 1 z 2 Krok 1: rejestracja z hasłem zakończonym spacją
Secret-pass-42- 15 grafemów
- 15 punktów kodowych
- 15 bajtów
- 15 jednostek UTF-16
połowa 2 z 2 Krok 2: logowanie tym samym hasłem bez spacji
Secret-pass-42- 14 grafemów
- 14 punktów kodowych
- 14 bajtów
- 14 jednostek UTF-16
- Co psuje
- Krok 3: jeśli działa tylko jedno z dwóch logowań i nie jest to logowanie ze spacją, rejestracja i logowanie przycinają inaczej, a użytkownik, który ustawił spację, traci dostęp do konta.
- Co robi poprawna aplikacja
- Konto otwiera tylko hasło ze spacją albo oba, bo obie strony przycinają.
Postać złożona i rozłożona tego samego hasła
passwords/nfc-nfdpołowa 1 z 2 Krok 1: rejestracja ze złożonymi polskimi literami
Zażółć-42- 9 grafemów
- 9 punktów kodowych
- 13 bajtów
- 9 jednostek UTF-16
połowa 2 z 2 Krok 2: logowanie tymi samymi literami w postaci rozłożonej
Zażółć-42- 9 grafemów
- 12 punktów kodowych
- 16 bajtów
- 12 jednostek UTF-16
- Co psuje
- Krok 3: NIST SP 800-63B zaleca normalizację haseł do NFC. Bez niej to samo hasło wpisane w jednym systemie i wklejone z innego się nie zgadza.
- Co robi poprawna aplikacja
- Obie postacie otwierają konto.