wir haben unseren Shop in OXID 4.5.5 CE
Dieser wurde neu gemacht in OXID 4.9.5 PE
Jetzt zum Problem:
Wir wollen alle User vom Shop (OXID 4.5.5 CE) in den neuen Shop (OXID 4.9.5 PE) kopieren.
Dies mache ich per SQL in den Datenbanken (Export / Import).
Die User sind auch im Backende sichtbar, richtiger Name, richtige Adresse, …
Wenn ich mich jetzt im Shop einloggen will, geht dies nicht!
Ich habe mich schlau gemacht … Oxid 4.5.5 verschlüsselt die passwörter noch mit MD5 und Oxid 4.9.5 verschlüsselt die Passwörter mit SHA-2.
Gibt es irgendeine Möglichkeit, dass alle User Ihr Passwort behalten?
Falls nein, gibt es eine Möglichkeit, allen Usern ein bestimmtes Passwort zu geben, welchen Sie nach der 1ster Anmeldung ändern können?
In der Datenbank kann ich nur SHA-2-Hash Strings hinterlegen … und diese werden ja ‘zufällig’ erzeugt. So, dass das gleiche Passwort nicht den gleichen Hash-Code hat.
Verstehe ich das richtig … diese Modul kann MD5-Hash auf das eingegebene Passwort anwenden und in der Funktion _getLoginQuery() prüfen ???
Das Problem liegt darin, dass die in Oxid 4.5 gespeicherten Passwörter mit MD5 gehasht wurden und das Oxid 4.9 die Hash-Variante SHA-2 benutzt. Und man kann die eingegebenen Passwörter, welche gehasht wurden (ob mit MD5 oder SHA-2 ist egal), ja nicht mehr zurückführen. … Man kann aus einem Hash keinen eindeutigen (100% richtigen) String mehr machen. Ein Hash-String von ‘Hallo’ kann der geliche sein wie von ‘sdfsdklfgsdfjkghdjkgh’.
Noch dazu hat das gleiche Passwort immer einen anderen Hash, eine andere Codierung.
Ich möchte irgendwie die Benutzer aus einem Shop in den anderen Shop importieren … mit dem gleichen Passwort.
Und die Frage an sich braucht eigentlich nur zu heißen:
Wie kriege ich die MD5 Passwörter der Benutzer in einen neuen Shop (SHA-2 Passwörter) importiert, so dass die Passwörter genau die gleichen sind wie im alten? (… incl. aller Benutzerdaten)
ich habe deine Antwort falsch verstanden.
Habe das Modul ausprobiert … und es hat geklappt !!!
Vielen Dank!!!
Jetzt müsste ich nur noch wissen, ob es irgendwie Möglich ist, die Passwörter aus dem alten Shop in den neuen Shop zu importieren … und die Passwörter die gleichen bleiben.
Ansonsten wäre dein Modul unsere Lösung.
[QUOTE=Schumc;179053]
…
Jetzt müsste ich nur noch wissen, ob es irgendwie Möglich ist, die Passwörter aus dem alten Shop in den neuen Shop zu importieren … und die Passwörter die gleichen bleiben.
[/QUOTE]
wie schon oben beschriebem das ‘alte’ Passwort (+ oxpasssalt) in die Tabelle oxuser in eigene Felder schreiben und im Prinzip die Passwort-Prüfung aus der 4.5er-Version mit in das Modul einbauen.
Wenn ich die Passwortprüfung der alten version in das Modul einbaue, stimmen die Passwörter nicht überein. Kling logisch, weil md5 immer einen zufälligen Hash aus dem vorgegebenen Wert bildet.
Der alte (Test) Hash-Wert lautet (Datenbank kopiert vom alten Oxid):
9e93b2c2bdbd04846782d90804611bbf
Der neue Wert lautet (das eingegebene Passwort), wenn ich ihn über ‘MD5($oDb->quote( $sPassword ), hex2bin( oxuser.oxpasssalt ))’ ausgeben lasse:
7f807489b689131f14d342d77a7711e0
Ich werde es wohl so lösen (versuchen so zu lösen :p), dass alle User sich mit dem gleichen Passwort einloggen können und direkt auf die Seite weitergeleitet werden, um das Passwort zu ändern. Es sei denn, du kannst mir erklären, wie es möglich ist, an den gleichen MD5-Hash-Wert zu kommen. das wäre natürlich die beste Lösung
PS: ich habe die alte Passwortkontrolle zu 100% kopiert und nur die Spalte geändert …
oxuser.oxpassmd5 = MD5( CONCAT( “.$oDb->quote( $sPassword ).”, UNHEX( oxuser.oxpasssalt)))
[QUOTE=Schumc;179084]…
wenn ich ihn über ‘MD5($oDb->quote( $sPassword ), hex2bin( oxuser.oxpasssalt ))’ ausgeben lasse …
[/QUOTE]
Du musst den (alten) salt-Wert auch in der Tabelle oxuser speichern und mit verarbeiten!
zwei Spalten in der Tabelle oxuser einfügen und mit den alten Werten füllen:
[ul]
[li]mypasswordmd5[/li][li]mypasssalt[/li][/ul]
die Passwortprüfung am besten in eigene function schreiben:
function myPasswordOk ($sPWD, $sUser) {
$oDb = oxDb::getDb();
$sSelect = 'select oxid, mypasswordmd5, mypasssalt from oxuser where oxuser.mypasswordmd5 != “” and oxuser.oxactive = 1 and oxuser.oxusername = '.$oDb->quote($sUser);
ich habe es getestet und ich komme immer auf den Bildschirm der Wartungsarbeiten am Shop.
Habe danach den ‘die()’ Befehl ausgeben lassen.
Nach der Zeile:
$sTest = $oDb->getOne( “select MD5( CONCAT( “.$oDb->quote( $sPassword ).”, $rs->fields[2] ) )” );
wird der die() Befehl nicht mehr ausgeführt und ich werde auf die Seite ‘Wartungsarbeiten am Shop’ geleitet.
Ich habe die Funktion bis jetzt immer in dein Modul eingebaut, weil ich nicht weiss, wo sich die Login-Funktion im neuen Oxid befindet. Ich finde sie auch nicht durch durchsuchen der Dateien nach ‘_getLoginQuery’.
Falls es daran liegt, dass die Funktion in dem Modul nicht laufen kann, könntest du mir bitte sagen, in welcher Datei ich die Funktion aufrufen muss und in welche Datei ich die Funktion schreiben muss??
Wenn ich das Modul benutze, wird doch auch das Passwort übergeben.
Somit habe ich in deinem Script (s.o.) die Variable ‘$sPWD’ in in ‘$sPassword’ geändert.
Und die Variable $sPassword wird auch in der Funktion richtig ausgegeben (Das eingegebene Passwort des Users).
<?php
class myuser extends myuser_parent {
function _getLoginQuery($sUser, $sPassword, $sShopID, $blAdmin)
{
//die("AAA: " . $sPassword);
$oDb = oxDb::getDb();
$sSelect = 'select oxid, oxpassword, oxpasssalt from oxuser where oxuser.oxpassword != "" and oxuser.oxactive = 1 and oxuser.oxusername = '.$oDb->quote($sUser);
$rs = $oDb->select( $sSelect );
if ( $rs != false && $rs->recordCount() > 0 ) {
while (!$rs->EOF) {
$sTest = $oDb->getOne( "select MD5( CONCAT( ".$oDb->quote( $sPassword ).", $rs->fields[2] ) )" );
if ( $sTest == $rs->fields[1] ) {
// OK
die("BBB");
return true;
break;
}
$rs->moveNext();
}
}
die("CCC");
return false;
}
Ich habe die Funktion ja in die Funktion des Moduls gesetzt.
Das heisst, ich benutze ohnehin $sPassword.
Und das wird auhc übergeben (das Passwort, das der User eingegeben hat).
Noch dazu liegt das alte Passwort und der alte Salt-Wert in den Feldern ‘oxpassword’ und ‘oxpasssalt’ … wo auch die vom User eingegebenen Daten gespeichert werden, wenn er sich neu registriert.
Hier die Funktion:
<?php
class myuser extends myuser_parent {
function _getLoginQuery($sUser, $sPassword, $sShopID, $blAdmin)
{
$oDb = oxDb::getDb();
$sSelect = 'select oxid, oxpassword, oxpasssalt from oxuser where oxuser.oxpassword != "" and oxuser.oxactive = 1 and oxuser.oxusername = '.$oDb->quote($sUser);
$rs = $oDb->select( $sSelect );
if ( $rs != false && $rs->recordCount() > 0 ) {
while (!$rs->EOF) {
$sTest = $oDb->getOne( "select MD5( CONCAT( ".$oDb->quote( $sPassword ).", $rs->fields[2] ) )" );
if ( $sTest == $rs->fields[1] ) {
// OK
return true;
break;
}
$rs->moveNext();
}
}
return false;
}
Ich habe die von dir oben geschriebene Funktion in das Modul eingebunden. Das Eingegebene Passwort des Users steht in der Variablen $sPassword. Ich habe es mir auch ausgeben lassen.
Das alte Passwortu nd der alte Salt-Wert stehen in den Feldern, die auch beschrieben werden, wenn sich jemend neu registriert (oxpassword und oxpasssalt). Ich hoffe mal das ist kein Problen
Hier die Funktion:
<?php
class myuser extends myuser_parent {
function _getLoginQuery($sUser, $sPassword, $sShopID, $blAdmin)
{
$oDb = oxDb::getDb();
$sSelect = 'select oxid, oxpassword, oxpasssalt from oxuser where oxuser.oxpassword != "" and oxuser.oxactive = 1 and oxuser.oxusername = '.$oDb->quote($sUser);
$rs = $oDb->select( $sSelect );
if ( $rs != false && $rs->recordCount() > 0 ) {
while (!$rs->EOF) {
$sTest = $oDb->getOne( "select MD5( CONCAT( ".$oDb->quote( $sPassword ).", $rs->fields[2] ) )" );
if ( $sTest == $rs->fields[1] ) {
// OK
return true;
break;
}
$rs->moveNext();
}
}
return false;
}
naja, so kann es natürlich nicht funtionieren!
Das ‘alte’ Passwort + das ‘alten’ Salt sollte in eigene Felder geschrieben werden, weil evtl. ein Besucher sonst Fehlermeldungen bekommt zB. bei PayPal-Express und diese Erweiterung in ein bis zwei Jahren wieder entfernt werden kann. Aber egal …
(im code unten dann geändert auf oxpassword und oxpasssalt)
Zum Modul:
die Klasse myuser erweitert die oxuser - s. metadata
die function _getLoginQuery muss [B]immer [/B]einen select-string zurückgeben (nicht true oder false)
meine function myPasswordOk [B]zusätzlich[/B] einbauen!
in der function _getLoginQuery eine [B]zusätzliche[/B] Prüfung einbauen
die _getLoginQuery sieht dann so aus:
function _getLoginQuery($sUser, $sPassword, $sShopID, $blAdmin)
{
$myConfig = $this->getConfig();
$oDb = oxDb::getDb();
$sUserSelect = "oxuser.oxusername = " . $oDb->quote($sUser);
$sShopSelect = "";
// admin view: can only login with higher than 'user' rights
if ($blAdmin) {
$sShopSelect = " and ( oxrights != 'user' ) ";
}
$sMasterPassword = $myConfig->getConfigParam( 'sMasterPassword' );
$sSelect = "select `oxid` from oxuser where oxuser.oxactive = 1 and {$sUserSelect} {$sShopSelect} ";
if ($sMasterPassword != '' && $sPassword == $sMasterPassword) {
return $sSelect;
}
if ($this->myPasswordOk($sUser, $sPassword)) {
return $sSelect;
}
return parent::_getLoginQuery($sUser, $sPassword, $sShopID, $blAdmin);
}
function myPasswordOk ($sUser,$sPWD) {
$oDb = oxDb::getDb();
$sSelect = 'select oxid, oxpassword, oxpasssalt from oxuser where oxuser.oxpassword != "" and oxuser.oxactive = 1 and oxuser.oxusername = '.$oDb->quote($sUser);
$rs = $oDb->select( $sSelect );
if ( $rs != false && $rs->recordCount() > 0 ) {
while (!$rs->EOF) {
$sTest = $oDb->getOne( "select MD5( CONCAT( ".$oDb->quote( $sPWD ).", $rs->fields[2] ) )" );
if ( $sTest == $rs->fields[1] ) {
// OK
return true;
break;
}
$rs->moveNext();
}
}
return false;
}
Aber diese Zeile verstehe ich auch nich so ganz … offen gestanden
Ein select ohne Parameter zum Umwandeln des eingegebenen Passwortes.
Der Part lautet in OXID 4.5
oxuser.oxpassword = MD5( CONCAT( “.$oDb->quote( $sPassword ).”, [B]UNHEX/B ) )
ich habe das UNHEX mal eingebaut … hat aber nichts gebracht.
Die Logik dahinter leuchtet mir zwar ein … aber funktionieren tut es nicht
da ist irgendwo ein Syntxfehler, sehe ihn aber auch nicht …
anyway:
baue einfach den Passwort-Encoder “encodePassword()” aus der 4.5er-Version als encodePasswordMD5() mit ein und verwende den stattdessen
if ( $sTest == $rs->fields[1] ) {
// OK
return true;
break;
}
Jetzt läuft er auch durch, meldet sich aber trotzdem nicht an.
OXPASS aus der 4.5er Version in die 4.9er Datenbank kopiert
oxpassmd5 = 815d0bb80602b47a1d69130afdd77d66
Aber $sTest = 8c8722584b2f7819af48c16246fa6d9a
Jetzt gibt der mir für das gleiche Passwort auch immer den gleichen Hash-Wert ($sTest) aus.
Aber woher soll die 4.9er Version wissen, dass die 4.5er Version einen anderen Hash-Wert für das Passwort benutzt hat?
Ich weis nicht, ob es Serverabhängig ist, wie der Hash-Wert zusammen-gewürfelt wird … aber könnte es daran liegen, dass die Shops auf 2 verschiedenen Servern liegen?
Mein Testpasswort klappt, ich kriege mich eingeloggt
habe in der Datenbank den Account im alten und im neuen Shop deleted … habe mich im alten Shop neu registriert (mit einem anderen Passwort), in die neue Datenbank kopiert (oxpassword und oxpasssalt sind leer) … in die Felder ocpassmd5 und oxpasssaltmd5. So kriege ich mich NICHT angemeldet im neuen Shop!
Wenn ich oxpassmd5 und oxpasssaltmd in die Datenbank-Felder oxpassword und oxpasssalt kopiere (so, dass alle 4 Felder gefüllt sind - man kann egal was in die Felder schreiben (getestet ;p)) kriege ich mich angemeldet! Er erkennt das Passwort !!!
Schonaml einen großen Schritt weiter
Besteht die Möglichkeit, die Felder oxpassword und oxpasssalt leer zu lassen, oder so einzustellen, dass der User sein Passwort ändern kann? Denn logischerweise erkennt er die MD5 Passwörter auch dort nicht … im Bereich ‘Passwort ändern’. Denn dort muss man ja 1 mal das alte Passwort und 2 mal das neue Passwort eingeben.
Oder in welche Datei müsste ich die Funktion myPasswordOk() einbauen, damit das Passwort geändert werde kann?
Hallo, wenn ich das richtig in Erinnerung habe, wurde die Verschlüsselung beim Anlegen von Benutzern geändert. Der Login prüft aber erst auf SHA und bei einem fehlerhaften Login danach auch wie bisher auf MD5.