Mit welchem Verfahren wurden die Passwörter verschlüsselt?
So etwas ist ohne Anhaltspunkte nur schwer herauszufinden. Wenn es sich um einen proprietären Hash-Algorithmus handelt, sind in meinen Augen weitaus mehr Daten nötig, um herausfinden zu können, wie der Algorithmus funktioniert. Eigentlich sollte die Sicherheit eines Verfahrens maßgeblich durch die Geheimhaltung der Schlüssel und nicht die Geheimhaltung des Algorithmus bestimmt werden (Kerkhoffs Prinzip).
Als Basis für meine Überlegungen habe ich nun die Hash-Länge verwendet. Diese entspricht mit 32 Hexadezimalzahlen der des MD5-Algorithmus. Also habe ich ein paar Experimente unter Zuhilfenahme meiner Java-Funktionen gestartet:
public static String sha1(final String to_hash) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA1");
final byte[] result = digest.digest(to_hash.getBytes());
final StringBuffer buffer = new StringBuffer();
for (int i = 0; i < result.length; i++) {
buffer.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return buffer.toString();
}
public static String sha256(final String to_hash) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
final byte[] result = digest.digest(to_hash.getBytes());
final StringBuffer buffer = new StringBuffer();
for (int i = 0; i < result.length; i++) {
buffer.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return buffer.toString();
}
public static String md5(final String to_hash) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("md5");
final byte[] result = digest.digest(to_hash.getBytes());
final StringBuffer buffer = new StringBuffer();
for (int i = 0; i < result.length; i++) {
buffer.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return buffer.toString();
}
Meine Idee bestand darin, verschiedene Outputs an Hash-Strings erneut zu hashen (quasi eine "Hash-Chain"). Ich habe mir als Limit die Bildung von Hash-Chains der maximalen Länge 5, bei denen alle Kombinationsmöglichkeiten bezüglich der Algorithmen berücksichtigt werden, zu bilden. Zudem habe ich die Hashes je in Upper- und Lowercase-Lettern getestet. Dabei war MD5 immer der letzte Funktionsaufruf (diese Annahme fußt, wie bereits erwähnt, auf der Länge des Hashs).
Und bei einer habe ich tatsächlich die von Dir gegebenen Hashes erhalten (weshalb Du diese Antwort leist ;-)):
md5(sha1(md5("passwort"))); // Zuerst MD5, dann SHA1, dann wieder MD5
Du kannst die anderen Passwörter auch testen.
Es ist aber nicht die Regel, dass man bei unbekannten Verfahren "so leicht" auf den Algorithmus schließen kann. Ich bin davon ausgegangen, dass der Initiator eures Problems kein Sadist ist ;-)