Dada la salida de hash, siempre se puede intentar tener suerte e inyectar valores aleatorios hasta que se encuentre una coincidencia. En su ejemplo, cualquier cracker de contraseñas decente debería probar "helloworld" y "goodbyeworld" muy rápidamente (como, dentro del primer segundo de intentarlo) porque son cadenas de contraseña extremadamente clásicas.
En un caso más general: dada una función hash criptográfica h y los valores h ( m || x ) y h ( m ' || x ) para valores desconocidos de m , m ' y x , no es posible recuperar m , m' o x excepto siendo afortunado en el sentido del párrafo anterior (el atacante prueba exactamente m || x como entrada). Esto es válido para la función hash criptográficamente segura, y MD5, a pesar de sus debilidades con respecto a las colisiones (que son irrelevantes aquí), sigue siendo "lo suficientemente seguro" para eso.
(Por supuesto, se debe tener en cuenta que MD5 no tiene "sal", por lo que cualquier mención de MD5-con-sal realmente significa "alguna construcción personalizada, casera, no estándar que involucre a MD5 y un valor que el el diseñador elige llamar 'una sal' ". En general, se deben evitar las construcciones caseras.)