// using htmlentities to allow funky characters for better passwords
Since these passwords are never being displayed - let alone displayed in HTML, then a simple escaping operation would be sufficient (since you're using MySQL, that would be [man]mysql_real_escape_string[/man]). Using the correct function would also be more robust and wouldn't mean garbling the data you store.
In fact, once you hash it, then no matter what characters were in the password to begin with, the result will always be exactly thirty-two characters selected from [0123456789abcdef] - none of which need any sort of escaping to be embedded in an INSERT query.
On the other hand, using html entities means that "<password>" will hash as "cb1ebc435675187bdcfb539b370c2e37" instead of "34b339799d540a72bf1c408c0e68afdd". If there might be any passwords with "funky characters" already stored then unless you're prepared to replace them you're stuck with using htmlentities.
"Passwords must be between 6 and 28 characters long."
Why the maximum? If I want [font=monospace]PoEyapTiPVJotGHPCAywndbatpfdotorotGrtboahertyssarypiootsfdTpwtslttoyEmTy[/font] (and I can reproduce that from memory when needed) then why can't I have it? It doesn't cost you anything extra to store.