Não é uma resposta direta sobre o armazenamento das senhas, mas geralmente uso pelo menos duas conexões de banco de dados ao criar aplicativos da Web - um usado 99% do tempo para atividades relacionadas ao usuário, com privilégios restritos, e o outro usado para a funcionalidade 'admin' (excluir usuários etc.).
Em alguns casos, em que estou instalando o pacote de outra pessoa, instalarei duas instâncias ... uma instância voltada para o público que só tem acesso ao banco de dados para fazer as coisas gerais do tipo usuário, e uma segunda instância com restrição de IP para minha sub-rede local (possivelmente até em uma máquina diferente) que deve ser usada para qualquer atividade do tipo 'admin'. Porém, nenhum deles tem acesso para modificar tabelas, etc ... Prefiro acessar as ferramentas de banco de dados nativas do que permitir que o webapp execute suas próprias tarefas de atualização que não foram examinadas.
Você pode ir ainda mais longe e adicionar mais conexões especificamente para determinadas tarefas ... para que as tarefas de criação e gerenciamento de senhas do usuário passem por um usuário que tenha privilégios adicionais nas tabelas de usuários, o login tenha privilégios de banco de dados para autenticar e não muito mais etc.
Dessa forma, se houver um ataque de injeção de sql, na maioria das páginas da Web ele não poderá fazer nada significativo - não poderá ver os hashes de senha, não poderá adicionar um novo usuário administrador (não que eles possam fazer de qualquer maneira), etc. Ainda não ajudará se eles conseguirem obter um shell em sua máquina, mas os atrasará.