Gli unici errori di progettazione di un'applicazione sicura li trovi qui: http://phpsec.org/projects/guide/
Gli altri sono giochettini sicuri.

Per i punti 1-4: in generale si fa così infatti. Commenti:
2) no, deve verificare la corrispondenza di MD5(password_originale) (quindi ciò che è su db) con MD5(password_digitata);
3) - 4) certo, ma non vedo proprio il motivo dei 30 min. Irritare i tuoi clienti??

Inoltre, ma è proprio necessario e utile criptare i dati del database per proteggerli dai birboni esterni?
Sì.