Wracając do pytania: tak, musiałbyś mieć hashe dla podciągów.
Przy czym to też nie ma sensu, bo równie dobrze wtedy można trzymać całe hasło plaintextem. Jeśli ktoś ma 13znakowe hasło, i mamy hashe z 10 trzyznakowych podciągów to zagadka, jak trudno będzie zbrutować wszystko? ;] Hint: wystarczy zgadnąć chociaż jeden hash, a reszta pójdzie jak z płatka. Hash trzyznakowego podciągu.
Jeśli podciągi mają być krótsze niż 7 znaków, to naprawdę, w tym przypadku cokolwiek poza trzymaniem plaintextu będzie w najlepszym wypadku security theatre (i to zakładając mocną funkcję hashującą, np. jakiś scrypt). Oczywiście, możecie trzymać hashe, żeby klient myślał że jest bezpieczniej, ale nie będzie.
A jak by te poprzednie hasła zaszyfrować/zakodować, używając aktualnego jako klucza? Wtedy jawnie nie będą, a przy zmianie hasła bez problemu się je uzyska celem porównania, podmiany najstarszego na klucz, i zabezpieczenia z powrotem nowym hasłem.
No nie jest idealne, ale faktycznie najlepsze z podanych tutaj. Wtedy faktycznie (jeśli dobrze się zrobi szyfrowanie), najwyżej będzie można poznac wszystkie hasła użytkownika, łamiąc jego obecne.
oprócz hasha całego hasła musisz przechowywać hashe poszczególnych cześci hasła. Np użytkownik wprowadza hasło AB12345678, a niepowtarzalna fraza to 5 znaków robisz hashe AB123, B1234, 12345, 23456, 345678. To samo robisz dla nowego hasła i porównujesz ze starymi. To tak na szybko co mi przychodzi do głowy.
Nie, to dramatycznie zły sposób. Patrz wyżej.
Owszem, ale jeśli klient się uprze, to jedyna sensowna propozycja czyli haszowanie podciągów będzie miała "hasła" o stałej, z góry znanej długości co sprawi że będzie warto zrobić tęczowe tablice i łamać te hashe celem złożenia z nich poprzednich haseł.
Czemu wszyscy często mówią o tęczowych tablicach, nikt od dawna nie używa tęczowych tablic :P.
@sig jest to jakieś rozwiązanie, ale też nie jest idealne, bo jeśli nie zrobisz tego odpowiednio to będziesz wyciekał informację o długości hasła.
Niby tak, ale 1) wyciek długości hasła to w sumie żaden problem 2) szyfry blokowe i tak zaokrąglą długość danych do 16.