# Passwort entschlüsseln



## OnDemand (3. Apr 2015)

Hallo zusammen,

kennt sich hier jemand mit Passwortencryption aus? Folgender Hintergrund: ich habe mit Joomla eine Website und Webshop und möchte, dass sich  der User in meiner Software mit den Joomla-Logins einloggen kann.

Soweit ich das ergooglen konnte, wird das Password mit MD5 und gesalzen. dazwischen ein Punk als Tenner. Nun habe ich aber null Plan, wie ich das vom USer eingegebene PW mit dem aus der Joomla DB vergleichen kann. Kann mir hier jemand helfen?

BTW; Woher kommt das *Salt* in der Verschlüsselung, kommt das wirklich vom salzen, also etwas hinzutun? 

Edit: Joomla 3 nutzt bcrypt, nicht MD5


----------



## fLooojava (3. Apr 2015)

NicoDeluxe hat gesagt.:


> BTW; Woher kommt das *Salt* in der Verschlüsselung, kommt das wirklich vom salzen, also etwas hinzutun?



_Ja, das stimmt. Beispielsweise in php hast du eine beliebige Zeichenkette ( $salt = "irgendwas"; )  die dann einfach zum Passwort hinzugefügt wird und anschließend verschlüsselt wird. Damit erhöhst du die Entropie -> somit auch die Sicherheit._


----------



## OnDemand (4. Apr 2015)

Hab jetzt mal etwas rumprobiert.. das will nicht funktionieren. Ich kann nicht mal den gespeicherten Hash splitten. Kommt immer Arrayindexout of Bounce..ist doch aber korrekt hier oder:

```
String storedPassword = result.getString("password");
		System.out.println(storedPassword);
		String [] hash = storedPassword.split(".");
		System.out.println(hash[1]);
```


----------



## cafebabe (4. Apr 2015)

Ohje ohje, ohne dir zu nahe tretten zu wollen, aber wenns schon um (Webshop = vertraulich) Daten geht, solltest das viell jemand machen, der sich mit sowas ein bisschen auskennt... (oder du arbeitest dich da erst mal ein wenig tiefer ein ;-) )




NicoDeluxe hat gesagt.:


> BTW; Woher kommt das *Salt* in der Verschlüsselung, kommt das wirklich vom salzen, also etwas hinzutun?



Ähm jein, also ne Mühle brauchst du keine, aber "hinzutun" musst du schon was...

Erster treffer bei google: https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29

Kurze Zusammenfassung:
Krypto. Hash-Funktion : Einwegfunktion, sprich Hash(message) = hashvalue (einfach zu brechnen)
Umkehrung also hashvalue zu message (praktisch) nicht machbar

Prinzipieller ablauf:
HashValue = Hash(Passwort + Salt)  [Passwort geheim , Salt beliebiger Wert, muss nicht geheim bleiben]

Zwei (gehashte passwörter vergleichen:

HashValue_1 = Hash(Passwort_1 + Salt_1)
HashValue_2 = Hash(Passwort_2 + Salt_2)

Wenn HashValue_1 == HashValue_2 dann sind Passwort_1 und Passwort_2 mit an sicherheit grenzender Wahrscheinlichkeit gleich...


----------



## OnDemand (4. Apr 2015)

Hi..Ja das ist mir mittlerweile klar. Mir geht es darum, wie ich den korrekten hash bekomme. Welche bililothek etc. Der Joomla hash fängt mit $2y$ an ist das nun bcrypt md5 oder was ganz anderes? Kann nicht mal den hash splitten, warum auch immer. Muss was mit der Kodierung zu tun haben


----------



## Ruzmanz (4. Apr 2015)

"." steht in Regex für ein beliebiges Zeichen. Wenn du dannach splittest kann nichts gescheites bei rauskommen.


Google: "joomla password encryption"
php - joomla password encryption - Stack Overflow
Dort steht:


> From the joomla source file libraries/joomla/crypt/password/simple.php there are multiple ways they get stored, and some do not have a ':' character.



Schauen wir in die Datei, dann finden wir tatsächlich sowas wie *$2y$*. Das scheint also deine Verschlüsslung zu sein.
In weiteren 20 Sekunden wissen wir, dass '$2y$' BLOWFISH ist.
D.h. dein Hash entsteht durch:

```
case JCryptPassword::BLOWFISH:
				return crypt($password, $salt);
```

crypt scheint eine Methode von PHP zu sein ... PHP: crypt - Manual
Dort wird BLOWFISH mit Salt erklärt.


----------



## OnDemand (4. Apr 2015)

Hi Ruzmanz, danke dir. Nun  hab ich herausbekommen, dass Blowish in Java bCrypt ist. Hmm komischerweise funktioniert es nicht wie erhofft...

Passwörter stimmen nicht überein:


```
while (result.next()) {
		// Hash a password for the first time
		//String hashed = BCrypt.hashpw(passwordPlain, BCrypt.gensalt());
		 
		// gensalt's log_rounds parameter determines the complexity
		// the work factor is 2**log_rounds, and the default is 10
		String hashed = BCrypt.hashpw("meinPasswort", BCrypt.gensalt(10));
		 System.out.println("hashed: "+hashed);
		 System.out.println("database"+result.getString("password"));
		// Check that an unencrypted password matches one that has
		// previously been hashed
		if (BCrypt.checkpw(result.getString("password"), hashed))
		System.out.println("It matches");
		else 
		System.out.println("It does not match");
	    }
```

Mein Hash mit der Methode beginnt mit einem $2a$...

Die ausgegebenen Haschwerte müssen ja auch die selben Strings sein oder?

Also wenn das PW stimmt, wären ja beide $2y$10xxxxx


----------



## Ruzmanz (4. Apr 2015)

> Die ausgegebenen Haschwerte müssen ja auch die selben Strings sein oder?



Das mit dem Hash und Salt hast du wahrscheinlich immer noch nicht ganz verstanden. Du nimmst ein Passwort und schickt es in eine Ein-Weg-Verschlüsslung. Anschließen änderst du 1-2 Werte mit einer konstanten Funktion und konstanten Parametern. Das Resultat wird in der DB abgelegt. Um zu prüfen, ob beim Login das Passwort stimmt, musst du die selbe Prozedur wiederholen und vergleichst anschließen die Resultate. Aus diesem Grund muss der Hashwert übereinstimmen. Was anderes kannst du gar nicht prüfen.

$2a$ und $2y$ sind verschiedene Implementierungen. Das geht aus der PHP-Doku hervor.
Zudem kannst du nicht einfach BCrypt.gensalt(10) nutzen. Du brauchst den selben Salt, welche Joomla dir generiert.

Du vertraust grade aktuell purem Glück und hoffst, dass nach X-Stunden das richtige Resultat erzielt wird. Bau dir eine simple PHP Seite, welche dir in einen Hash umwandelt:

<?php
$password = "test";
$salt = "????????????????????????????";
echo crypt($password, $salt);
?>

Wenn du damit nicht den richtigen Hash ermitteln kannst, kannst du es in Java auch nicht.


----------



## OnDemand (4. Apr 2015)

Das mit dem Salt hab ich schon verstanden, wolle nur nochmal bestätigt haben, dass die Hashstrings übereinstimmen müssen. 
BCrypt.gensalt(10) ist der Default-Wert, welcher auch in Joomla genutzt wird (10 log-rounds heißt es da). Die PHP Seite bringt mich nicht weiter.


----------

