Jaki jest najprostszy sposób ukrywania danych wejściowych użytkownika?
Nie wyświetlam tego!
Ukrywanie haseł podczas ich wpisywania to stara tradycja. Ma to sens z punktu widzenia bezpieczeństwa w większości kontekstów: jeśli ktoś patrzy na twoje ramiona, nie chcesz, aby łatwo było zobaczyć, co piszesz. (Niektóre współczesne wytyczne bezpieczeństwa, np. 1 2 3 4 5 , zalecają jednak opcję wyświetlania hasła, ponieważ pozwala to użytkownikowi wybrać bardziej złożone hasła i mieć pewność, że nie spędzą czasu na naprawianiu go niewidocznym literówki. Największym ryzykiem nie jest surfowanie po ramionach, to zgadywanie z użyciem siły, prawdopodobnie offline.)
Zdecydowawszy, że hasło powinno być ukryte, realizatorzy musieli zdecydować, jak to zrobić. Terminal ma tryb, w którym wejście użytkownika jest pokazywane (echo włączone) oraz tryb, w którym wejście użytkownika nie jest pokazywane (echo wyłączone). Tryb wyłączania echa istnieje w pewien sposób: jest to tryb, w którym terminal nie wykonuje dodatkowej pracy polegającej na echu danych wprowadzanych przez użytkownika. Ten tryb musi istnieć również w aplikacjach, w których wpisanie klawisza nie wstawia tego znaku, ale wywołuje skrót aplikacji powiązany z tym klawiszem. Polecenia takie jak passwd
po prostu ustaw terminal na tryb wyłączania echa podczas odczytywania hasła.
Drukowanie gwiazdek dla każdej postaci wymagałoby dodatkowej pracy wdrożeniowej przy niewielkiej korzyści, czego realizatorzy passwd
komendy nie mieli ochoty robić. Nie ma trybu terminalu do drukowania gwiazdek, ponieważ byłaby to bardzo wyspecjalizowana funkcja, przydatna tylko podczas wprowadzania haseł.
Nawiasem mówiąc, jeśli chcesz zobaczyć hasło podczas jego zmiany, możesz użyć cat | passwd
(przynajmniej w niektórych systemach - niektóre wersje passwd
wymagają opcji podobnej, cat | passwd --stdin
a niektóre w ogóle tego nie akceptują). (Możesz nawet to zrobić { echo 'current password'; echo 'new password'; echo 'new password'; } | passwd
, ale nie rób tego: zapisałoby to hasła w historii powłoki, z których wiąże się o wiele większe ryzyko wycieku.) Zapewnienie tego za pomocą poleceń, które czytają hasło z terminala, a nie cokolwiek ich standardowe dane wejściowe, takie jak sudo
lub ssh
, są bardziej złożone; jeśli masz GUI, możesz użyć ssh-askpass, który pokazuje, ile znaków wpisałeś ( SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A
dla sudo; dla ssh jest to skomplikowane, gdy wywołujesz je z terminala).