La respuesta general es: hacer un poco de ingeniería inversa en la aplicación. Esta noción de "ingeniería inversa" es bastante grande; incluye:
- Leer la documentación (si corresponde) u otras notas de diseño que acompañan a la aplicación.
- Hablando con los desarrolladores que construyeron esa aplicación (es increíble lo que dirá la gente después de dos o tres pintas).
- Pasando por el código fuente, si está disponible. Desde el punto de vista de un atacante, el código fuente a menudo se puede obtener al pasar por los contenedores fuera de las oficinas del desarrollador, para buscar discos duros descartados o cintas de respaldo.
- Realice usted mismo los casos de prueba: regístrese en la aplicación con una contraseña que conozca y vea en qué se convierte en la base de datos. En particular, compruebe si cambiar su contraseña varias veces y volver a la primera le devuelve al mismo valor almacenado, u otro. Además, compruebe si dos usuarios distintos con la misma contraseña tienen el mismo valor almacenado.
- Desarmar los binarios de la aplicación. Esto es especialmente simple con los códigos de bytes Java y los ensamblajes .NET (para este último, he usado ILSpy con éxito).
Sin esa ingeniería inversa, vuelve a adivinar , un método cuya eficiencia es cuestionable. En su caso, el ejemplo que muestra se ve como la codificación Base64 de un valor binario de longitud 8 bytes ( 6b 33 b0 28 fa 14 60 fe
, específicamente). Esto sugiere un algoritmo que produce 64 bits, tal vez una variante del hashing basado en DES tradicional pero sin la sal.
Tenga en cuenta que una contraseña se puede cifrar , pero, con mucha mayor frecuencia, se hash ; a veces, es MACed . Estas son nociones muy distintas y encontrará mucha documentación que es muy confusa y confusa sobre este tema. Entonces, como guía de lectura:
Encriptación: con una clave , transforme algunos datos de entrada en otro formato que sea ilegible para cualquiera, excepto para aquellos que conocen la clave; con la clave, la transformación se puede revertir (esto se denomina "descifrado"), devolviendo el valor original.
Hashing: mezcle y mezcle los datos de entrada en una salida de longitud fija. No hay llave; La función es determinista y pública, y todos pueden aplicarla. El hash no es reversible; si la función hash es buena, entonces el único método para encontrar la entrada original (o al menos una entrada coincidente) es suerte (intenta entradas hasta encontrar la correcta).
MAC: de alguna manera es equivalente a un "hashing con clave". Necesitas la clave para computarlo; Pero incluso con la llave, no es reversible. Un MAC debe ser verificado , no "descifrado".