Cytat
Nie chce mi się wierzyć, że banki trzymają hashe
Mi nawet przez myśl nie przeszlo, żeby ich nie miały

Wydaje mi się, że dobrym rozwiązaniem było by zastosowanie elementu X w kodzie, który byłby ładowany z innego miejsca w systemie i byłby odpowiedzialny za kodowanie haseł. Banki mając do dyspozycji całe serwerownie mogą sobie pozwolić na postawienie maszyny dostępnej jedynie lokalnie, której zadaniem będzie tylko i wyłącznie kodowanie haseł. Co do samego mechanizmu porównywania poszczególnych literek to chyba jedynym rozwiązaniem jest rozbicie hasła na części i zakodowanie każdej literki z osobna. Może istnieją jakieś metody operujące na całym haśle, ale wątpie i ręki nie daje

Mechanizm szyfrowania już zależy od konkretnego systemu i raczej nie jest prosty. Tęgie głowy siedzą nad tym, żeby odczytanie przechowywanych danych było jak najtrudniejsze
Najlepszym rozwiązaniem według mnie jest stosowanie jakiejś dynamicznie generowanej soli i na pewno nie za pomocą liczb pseudolosowych

Np. imię lub nazwisko, czy za pomocą innych informacji podawanych przez użytkownika. Dodatkowo można zastosować specjalne opóźnienia tak jak @Crozin napisałeś, np 2ms. Dla użytkownika żadna różnica a dla kogoś kto puści skrypt w pętle spore utrudnienie.