A visszafejtési elméleted ott bukott meg, hogy megszámolhatatlan olyan expression van, amelyik ugyanarra a stringre hashelődik, ami ugye abból adódik, hogy mindenképp 128 bit lesz a hash. Megeshet, hogy az alma és a körte hashe ugyanaz lesz, bár nyilván ez csak két random expression, az esélye, hogy tényleg így van, kb 0.1

Edit: Csak a mondandóm lényege maradt le.. Szóval az md5, sha és társai, mind one-way hash algoritmusok, nincs visszafejtő algoritmus. Esetlegesen dictionary módszerrel szerezheted meg a jelszót, de mint az alma és a körte példájánál, kicsi rá az esély, hogy az a hash tényleg ahhoz a jelszóhoz tartozik, bár auth részről ez lényegtelen, mert ha már van egy olyan jelszavad ami ugyanarra hashelődik le mint az igazi jelszó, akkor bejutottál, ez inkább abból a szempontból érdekes, hogy ha van egy DB-d amiben lemented az almát hashelve, megszerzed a hash-t, ha egy másik DB-ben is ugyanez a jelszó van, akkor a hozzá tartozó appba már nem tudsz bejutni a körtével, mert lehet, hogy ott nem ezt az algoritmust használják.
To sum up: Jelszavakat nem tárolunk hashelve, semmi értelme nincs. MD5 gyorsabb mint a sha256/512 stb, így hashelésre én ezt ajánlom, viszont encryptionre kevés lesz önmagában bármelyik is. Lehet fokozni az encryptiont különböző módszerekkel, pl mint amit leírtam md5(password + salt), vagy akár belevihetsz egy timestampet is, md5(password + salt + created_at) vagy akár mindet lehashelheted külön és utána a konkatenált stringet hasheled tovább. Ezek azok a példák, amik roppant egyszerűen kivitelezhetőek, mégis viszonylag adnak egy biztonság érzetet.
Onnanstól meg, ha van a DB-hez loginja valakinek, ha szimpla hashelt jelszó van tárolva, nem kell semmit visszafejtenie, elég ha megváltoztatja a letárolt jelszót egy sajátra + lehasheli. Az én példámnál ez már nem fog működni, mert nem tudja az algoritmust, hogy mi alapján van lementve.