[PHP + VBA] Passwörter für Joomla 1.5 berechnen

And1.G

Lieutenant
Registriert
Nov. 2006
Beiträge
690
Ich muss bei Joomla 1.5 eine größere Zahl an Benutzern mit zufällig generiertem Passwort, welches aber bekannt sein muss einfügen.
Das habe ich bis jetzt in soweit per Excel realisiert, dass alles funktioniert, bis auf die Passwörter.
Und zwar komme ich mit dem Salt nicht so wirklich klar.
Die Passwörter liegen jedenfalls im Klartext vor und müssen nur irgendwie Joomla-tauglich gemacht werden.

Ich hab die entsprechenden Funktionen schon in den PHP Dateien gefunden, aber leider versteh ich nur Bahnhof.

Könnte mir jemand folgenden Code in VBA übersetzen oder mir irgendwie erklären, wie ich die Befehle am besten umsetzen kann?

PHP:
	function getCryptedPassword($plaintext, $salt = '', $encryption = 'md5-hex', $show_encrypt = false)
	{
		// Get the salt to use.
		$salt = JUserHelper::getSalt($encryption, $salt, $plaintext);

		// Encrypt the password.
		switch ($encryption)
		{
			case 'plain' :
				return $plaintext;

			case 'sha' :
				$encrypted = base64_encode(mhash(MHASH_SHA1, $plaintext));
				return ($show_encrypt) ? '{SHA}'.$encrypted : $encrypted;

			case 'crypt' :
			case 'crypt-des' :
			case 'crypt-md5' :
			case 'crypt-blowfish' :
				return ($show_encrypt ? '{crypt}' : '').crypt($plaintext, $salt);

			case 'md5-base64' :
				$encrypted = base64_encode(mhash(MHASH_MD5, $plaintext));
				return ($show_encrypt) ? '{MD5}'.$encrypted : $encrypted;

			case 'ssha' :
				$encrypted = base64_encode(mhash(MHASH_SHA1, $plaintext.$salt).$salt);
				return ($show_encrypt) ? '{SSHA}'.$encrypted : $encrypted;

			case 'smd5' :
				$encrypted = base64_encode(mhash(MHASH_MD5, $plaintext.$salt).$salt);
				return ($show_encrypt) ? '{SMD5}'.$encrypted : $encrypted;

			case 'aprmd5' :
				$length = strlen($plaintext);
				$context = $plaintext.'$apr1$'.$salt;
				$binary = JUserHelper::_bin(md5($plaintext.$salt.$plaintext));

				for ($i = $length; $i > 0; $i -= 16) {
					$context .= substr($binary, 0, ($i > 16 ? 16 : $i));
				}
				for ($i = $length; $i > 0; $i >>= 1) {
					$context .= ($i & 1) ? chr(0) : $plaintext[0];
				}

				$binary = JUserHelper::_bin(md5($context));

				for ($i = 0; $i < 1000; $i ++) {
					$new = ($i & 1) ? $plaintext : substr($binary, 0, 16);
					if ($i % 3) {
						$new .= $salt;
					}
					if ($i % 7) {
						$new .= $plaintext;
					}
					$new .= ($i & 1) ? substr($binary, 0, 16) : $plaintext;
					$binary = JUserHelper::_bin(md5($new));
				}

				$p = array ();
				for ($i = 0; $i < 5; $i ++) {
					$k = $i +6;
					$j = $i +12;
					if ($j == 16) {
						$j = 5;
					}
					$p[] = JUserHelper::_toAPRMD5((ord($binary[$i]) << 16) | (ord($binary[$k]) << 8) | (ord($binary[$j])), 5);
				}

				return '$apr1$'.$salt.'$'.implode('', $p).JUserHelper::_toAPRMD5(ord($binary[11]), 3);

			case 'md5-hex' :
			default :
				$encrypted = ($salt) ? md5($plaintext.$salt) : md5($plaintext);
				return ($show_encrypt) ? '{MD5}'.$encrypted : $encrypted;
		}
	}

Aufgerufen wird das ganze mit
PHP:
			$salt  = JUserHelper::genRandomPassword(32);
			$crypt = JUserHelper::getCryptedPassword($array['password'], $salt);
			$array['password'] = $crypt.':'.$salt;

Wobei es ja eigentlich nichts zur Sache tut, wie der Salt berechnet wurde, er besteht aber aus den Zeichen "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" und ist wohl 32 Zeichen lang.
Jedenfalls muss ich irgendwie eine Funktion nach dem Schema EncryptPasswort(Passwort as string, Salt as string) as string haben, aber es hakt an dem Zusammenspiel von Passwor tund Salt.

Wäre echt dankbar, wenn mir da jemand helfen könnte :)
 
Hallo And1.G,

du könntest ganz einfach die PHP Methode md5() verwenden. Die Funktion macht das "EncryptPasswort(Passwort as string, Salt as string) as string" für dich.

Also:
PHP:
 $salt  = JUserHelper::genRandomPassword(32);
            $crypt = md5($array['password']);
            $array['password'] = $crypt.':'.$salt;
Grüße

tewes

btw: Nice Avatar;)
 
Wie ich in PHP aus einem Text das Passwort mache, ist ja klar, dafür könnte ich ja den Code einfach kopieren und etwas umstrukturieren.
Aber ich brauche das ganze in VBA, damit ich aus den Passwörtern, die ich im Klartext habe etwas machen kann, was ich in die Datenbank schreiben kann.
(Bevor jetzt jemand schreit, ich hätte die Passwörter von meinen Benutzern mitgelogt, das ganze ist (wird) eine Homepage für unsere Stufe in der Schule, wo für jeden ein Benutzer angelegt wird, und der wird vorher mit einem zufallsgenerierten Passwort belegt, und die teilen wir dann den anderen mit, und auch, dass die sobald wie möglich geändert werden sollten)
Und die Liste von Benutzern hat 67 Einträge, und die per Hand im Backend einzufügen wäre ja etwas zuviel des guten, ich hoffe das versteht ihr ;)

Wenn ich den Code so richtig verstanden hab, dann ist folgender Teil für den Hash verantwortlich, der in die DB kommt:
PHP:
                $encrypted = ($salt) ? md5($plaintext.$salt) : md5($plaintext);
                return ($show_encrypt) ? '{MD5}'.$encrypted : $encrypted;
Aber ich bin nicht wirklich bewandert in PHP und verstehe diese Operatoren (? und : ) nicht...
Kann mir da jemand helfen?
Eine Funktion, die mir den MD5-Hash von einem String in VB berechnet hab ich und sie funktioniert auch, es geht im Prinzip nur um diesen Teil.

Aus dem Passwort 'test123' wird in der Datenbank '84e842bd967c32f92e9858d152de4ecd:5j86mddY1K4WIWs9K9r7tIR96dJgxjtS' wenn das weiterhilft...
Der Teil hinter dem Doppelpunkt stellt dabei wenn ichs richtig verstanden habe den Salt dar.
Aber wie fließt der in die Berechnung des Hash mit ein?
 
Das mit dem ? und : ist eine Verkürzte IF-Anweisung. Dort wird nur entschieden ob $salt mit in die Verschlüsselung aufgenommen wird oder nicht.
Wie du in VBA das verschlüsselts, weiss ich nicht. Dazu wird es aber sicherlich eine Funktion in geben. Einfach mal in die Doku gucken.
 
Aah, jetzt wird mir das ganze langsam etwas klarer.
Heißt also, der Befehl
PHP:
md5($plaintext.$salt)
hängt nur den Salt an das Passwort im Klartext und bildet davon den Hash, und bei der Ausgabe in die Datenbank wird an den Hash einfach der Salt drangehängt?
Dann wärs ja kein Problem ;)
 
Zurück
Oben