O mecanismo hash é realmente seguro?

Bem, eu sempre vi (e seguindo) pessoas dizendo para usar o mecanismo de hashing para armazenar senhas no banco de dados. Estou realmente preocupado se é seguro?

Vamos com o exemplo.

Vamos dizer que eu sou hacker e eu tenho o nome do banco de dados, id e senha. Agora eu tenho acesso total ao seu banco de dados.

O que as pessoas dizem que as senhas devem ser criptografadas porque, se alguém hackeia, elas ficam visíveis para os hackers.

Então, se eu executar a consulta comoselect id, password FROM userDetails Eu vou pegar os dados abaixo

Opção 1: sem hash
++++++++++++++++++++++++++++
+   id    +    password    +
++++++++++++++++++++++++++++
+  id01    +  password01   +
+  id02    +  password02   +
++++++++++++++++++++++++++++
Opção 2: com hash
++++++++++++++++++++++++++++
+   id    +    password    +
++++++++++++++++++++++++++++
+  id01    +  hasValue01   +
+  id02    +  hasValue02   +
++++++++++++++++++++++++++++

Bem, ainda digo, hashing é inseguro. Por que eu vou te dizer abaixo com código Java.

PreparedStatement pst = conn.prepareStatement("SELECT id, password FROM userDetails");
ResultSet rs = pst.executeQuery();
String randomPassword = "";
StringBuffer sb;
boolean myPassCheck = true;
while (rs.next()) {
    myPassCheck = true;
    while (myPassCheck) {
        // this will generate random password
        randomPassword = generateRandomPassword();
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] array = md.digest(randomPassword.getBytes());
        sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
        }
        if (sb.toString().equals(rs.getString(2))) {
            // this is password
            myPassCheck = false;
            System.out.print("id=" + rs.getString(1) + ", password=" + sb.toString());
        }
    }
}

Dessa forma, posso imprimir o nome de usuário e senha. (Eu sei que terei que gerar uma senha aleatória até não encontrar a senha). No entanto, desta forma, o mecanismo de senha de hashing também falha.

Também acredito que exista decodificador presente neste mundo que converterá os dados hash em dados reais.

Por isso estou pensando

O mecanismo de hash é seguro?Editar 1

Não estou falando apenas do MD5. Eu escolho o MD5 com o propósito de exemplo SOMENTE. Eu estou falando sobre qualquer mecanismo para senha segura

questionAnswers(4)

yourAnswerToTheQuestion