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.

passwords wersja 1.0, aktualizacja 2026-11-04 CC-BY-4.0

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-register

połowa 1 z 2 Dwa hasła różniące się po 72. bajcie

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1
  • 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-login

połowa 2 z 2 Dwa hasła różniące się po 72. bajcie

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2
  • 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-register

połowa 1 z 2 Dwa polskie hasła różniące się po 72. bajcie

łłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłł1 łłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłł1
  • 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-login

połowa 2 z 2 Dwa polskie hasła różniące się po 72. bajcie

łłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłł2 łłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłłł2
  • 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-register

połowa 1 z 2 Hasło ze spacją na końcu i bez niej

Secret-pass-42 Secret-pass-42\u0020
  • 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-login

połowa 2 z 2 Hasło ze spacją na końcu i bez niej

Secret-pass-42 Secret-pass-42
  • 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 2: logowanie tymi samymi literami w postaci rozłożonej

passwords/nfc-nfd-login

połowa 2 z 2 Postać złożona i rozłożona tego samego hasła

Zażółć-42 Zażółć-42
  • 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
16 ×
  • 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
fourquietriverscarrysevenpaperboatspasttheoldmillgate four quiet rivers carry seven paper boats past the old mill gate
  • 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
Password1! Password1!
  • 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
Qwerty123! Qwerty123!
  • 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
10 × Long-pass-
  • 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
пароль-42 пароль-42
  • 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
pass<word>42 pass<word>42
  • 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
Pa+ss%41-42 Pa+ss%41-42
  • 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-cut
tożsamość

poł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-chars
tożsamość

poł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-space
tożsamość

poł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-nfd
tożsamość

poł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.