Primero hay que ver de qué forma están accediendo a esas contraseñas.
¿Es accediendo directamente a la base de datos? Entonces el problema es a la hora de filtrar las entradas al programa, para impedir que hagan esas consultas.
¿Están leyendo las contraseñas desde el teclado del ordenador? Pueden haber instalado algún logger o programa espía en el ordenador, que vigila lo que se está escribiendo. Entonces hay que avisar al administrador del sistema para que ponga medidas.
Una buena forma para evitar que puedan leer la contraseña desde la base de datos es... no guardar la contraseña
Me explico: en lugar de guardar la contraseña, guardas el valor de
PASSWORD(contraseña) (función MySQL) (
el propio MySQL lo hace así). Entonces lo que se guarda es un valor
hash que es complicado de sacar. Si alguien se hace con la base de datos, no verá las contraseñas.
Y en la aplicación, a la hora de comprobar la autenticación, te vale con comprobar si el contenido del campo es igual al valor de PASSWORD() de la contraseña que recibimos ( `username' == 'usuario' AND `password` == PASSWORD(contraseña) ).
El problema es... si el usuario pierde la contraseña o se le olvida. Pues no pasa nada: le damos una nueva y actualizamos el campo de la base de datos.
P.D.: los valores
hash podrían sacarse por fuerza bruta, por eso cada vez se usan más bits. Una forma de dificultar aún más el procedimiento es la de ofuscar la contraseña ANTES de pasarla por PASSWORD(). Por ejemplo, si la contraseña del usuario es "contra", podemos convertirla en "tMraIcAoPnP" (hemos cambiado el orden de las letras de la contraseña y hemos agregado en posiciones fijas las letras "MIAPP". Y eso lo pasamos a PASSWORD(). Si alguien es capaz de sacar el valor original, le será más complicado saber el orden correcto de las letras y qué letras quitar