bommel1302
Goto Top

16 Byte Passwort ändern auf 41 Byte (1500 Einträge)

Hallo zusammen,

ich hoffe Ihr könnt mir mal wieder helfen.
Ich möchte in einer MYSQL Tabel das die Passwörter der User von 16Byte auf 41 Byte ändern.
Leider habe ich keinen Ansatz wie diese Änderung möglich ist.
Jeder User hat ja ein anderes Passwort und soll dieses nach der Umstellung auch behalten.
Habe es mit dem SQL-Befehl versucht, jedoch ist danach bei allen Usern das Passwort gleich.
UPDATE mysql.user SET Password = PASSWORD('password') WHERE 1;

Wie kann ich die 1500 Datensätze per Script abarbeiten?

Gruß Marcel

Content-ID: 195898

Url: https://administrator.de/forum/16-byte-passwort-aendern-auf-41-byte-1500-eintraege-195898.html

Ausgedruckt am: 23.12.2024 um 19:12 Uhr

Guenni
Guenni 15.12.2012 um 12:57:40 Uhr
Goto Top
Hi Bommel1302,

Wie kann ich die 1500 Datensätze per Script abarbeiten?

Du könntest z.B. die Update-Anweisung, . . . set spalte = wert where . . ., spalte = wert where . . . usw.,

in einer Schleife zusammensetzen. Leider hat die Tabelle user keinen eindeutigen Index, z.B. eine ID, und

in den Spalten host und user können Hosts und User auch noch mehrfach unter gleichem Namen vorhanden sein.

Eine korrekte Anweisung wäre dann . . . password = PASSWORD(password) where host = 'host' and user = 'user'

für jede Zeile der Tabelle.


<code type = "PHP">
<?php
$query = "select host, user, password from user";
$result = mysql_query($query);
/*
  • Update-Anweisung in Variable speichern
*/
$update = "update user set ";
/*
  • Die Änderungs-Anweisung, where-Klausel und ein Komma an die Anweisung anhängen
*/
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
$update.=" password = PASSWORD(".$row['password'].") where host = ".$row['host']." and user = ".$row['user'].",";
}
/*
  • Das letzte Komma entfernen
*/
$update = substr($update, 0, -1);
/*
  • Ausgabe zum Prüfen
*/
echo $update;
// mysql_query($update);
?>


Natürlich nicht selber getestet, da ich meine eigene user-Tabelle nicht verändern will face-smile

Gruß
Günni
Bommel1302
Bommel1302 15.12.2012 aktualisiert um 14:40:46 Uhr
Goto Top
Hallo Günni,

danke für die Unterstützung.

Ich haben das mal probiert und habe das Script von Dir angepasst. Ich habe eine eindutige ID der User und die User sind nur einmal in der Datenbank.

Jedoch bekomme ich einen Fehler beim ausführen.

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /XXXXXX/DBUpdate.php on line 23
update username set

Hier das Script
<? 
include("config/config.php");  
if ($dbhost=="") {  
	echo"<meta http-equiv=\"refresh\" content=\"0; URL=install.php\">";  
}else{

}

@session_start();
mysql_connect( "$dbhost", "$dbuser", "$dbpass")  or  die("$wort_konnte_datenbankverbindung_nicht_herstellen");  
mysql_select_db( "$dbname")  or  die("Datenbank nicht gefunden");  


$query = "select id, username, pwd from user";   
$result = mysql_query($query); 
/* 
* Update-Anweisung in Variable speichern 
*/ 
$update = "update username set ";   
/* 
* Die Änderungs-Anweisung, where-Klausel und ein Komma an die Anweisung anhängen 
*/ 
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){ 
$update.=" pwd = PASSWORD(".$row['pwd'].") where host = ".$row['id']." and username = ".$row['username'].",";   
} 
/* 
* Das letzte Komma entfernen 
*/ 
$update = substr($update, 0, -1); 
/* 
* Ausgabe zum Prüfen 
*/ 
echo $update; 
// mysql_query($update); 
?>
Guenni
Guenni 15.12.2012 um 17:17:57 Uhr
Goto Top
Hi Bommel1302,


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource . . .


Das ist jetzt kein direkter Fehler im Script. mysql_fetch_array erwartet ein Abfrageergebnis,

das von mysql_query geliefert wurde. Der Fehler liegt dann in der Formulierung der Abfrage

und/oder in der Korrektheit der abgefragten Tabellen und Feldnamen.

<?php
$result = mysql_query($query);

if(!$result){
 echo mysql_error();
 exit;
}
?>


Das Update würde eh' nicht funktionieren, da du die tabelle user abfragst . . .

$query = "select id, username, pwd from user";

. . . aber in der Update-Anweisung eine Tabelle namens username angibst . . .

$update = "update username set ";

Gruß
Günni
Bommel1302
Bommel1302 15.12.2012 um 19:42:14 Uhr
Goto Top
Hallo Günni,

habe das Script entsprechend angepasst.
Es läuft jetzt. Leider hat es nicht den gewünschten Effekt.
Bei der Ausführung wird das Passwort ja ausgelesen aber nur der Hash nicht in den Klartext.
Um das Passwort in ein 41Byte Hash zu wandeln muss es ja einmal im Klartext sein um es dann zu wandeln.
Gibt es hier eine Lösung für?

Gruß Marcel
Pjordorf
Pjordorf 15.12.2012 um 20:06:11 Uhr
Goto Top
Hallo,

Zitat von @Bommel1302:
Bei der Ausführung wird das Passwort ja ausgelesen aber nur der Hash nicht in den Klartext.
Was denn sonst? Dachtest du das du so das Passwort in Klarschrift geliefert bekommst?

Um das Passwort in ein 41Byte Hash zu wandeln muss es ja einmal im Klartext sein um es dann zu wandeln.
Wie soll es denn anders gehen? Der 41 Byte lange Hasch ist doch neu berechnet und hat mit dem alten 16Byte langen Hadch doch nichts gemeinsam. Wenn du die Passwörter der 1500 Einträge nicht kennst, dann kann nur der Inhaber der Passwörter dies Ändern. Ist doch auch gut so, oder?

Das http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html hast du verstanden welche Problme dir die Umstellung geben kann?

Gruß,
Peter
Bommel1302
Bommel1302 15.12.2012 um 20:15:52 Uhr
Goto Top
Ja ich habe das verstanden.
Leider hat wohl der Hoster etwas an seinen Einstellungen geändert, so das das Script was seit 2Jahren läuft plötzlich nicht mehr läuft und die 16Byte Hash nicht mehr akzeptiert.
Bei der Eingabe des Passworts durch den User wird ein 41Byte Hash erzeugt, welcher natürlich nicht zu dem Hash in der Datenbank passt.
Gibt es hier eine Lösung um das wieder zum laufen zu bekommen?

Gruß Marcel
nxclass
nxclass 16.12.2012 aktualisiert um 00:09:10 Uhr
Goto Top
Das klingt mir stark nach einem PHP update, welches das Standard verhalten des Befehls crypt() geändert hat - wenn Du crypt() verwendest, dann lies mal die Beschreibung auf http://php.net/manual/de/function.crypt.php durch und frag ggf deinen Provider nach den PHP Versionen welche verwendet wurden.

EDIT: .. oder gib uns mal einen Code Schnippsel - welcher zeigt wie bei Dir diese Hashes gebaut werden.
EDIT: der Link von Pjordorf ( http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html ) zeigt eigentlich schon das Problem und die Lösung.
benutze OLD_PASSWORD() in der SQL Anweisung wenn der Hash 16 Zeichen lang ist - wenn dieser bei der Prüfung passt, sollte ggf gleich ein Hash mit der aktuellen PASSWORD() Funktion angelegt werden.
Bommel1302
Bommel1302 16.12.2012 um 09:56:26 Uhr
Goto Top
Laut dem Hoster hat sich die PHP Version 5.2 nicht geändert.
Leider bin ich nicht der Experte in PHP und Versuche die Anmeldung wieder zum laufen zu bringen.
Ich versuche mal ob ich den Code finde in dem der Hash gebaut wird.
Ferde ihn dann posten.

@nxclass

kannst du das mir etwas genauer erklären?

Zitat von @nxclass:
benutze OLD_PASSWORD() in der SQL Anweisung wenn der Hash 16 Zeichen lang ist - wenn dieser bei der Prüfung passt, sollte
ggf gleich ein Hash mit der aktuellen PASSWORD() Funktion angelegt werden.

Gruß Marcel
nxclass
nxclass 16.12.2012 um 10:10:36 Uhr
Goto Top
suche im SQL nach PASSWORD() und ersetze es mit OLD_PASSWORD() - wenn dann die Anmeldung geht, kannst Du dir Gedanken machen wie Du in Zukunft deine Passwörter speicherst.
Bommel1302
Bommel1302 16.12.2012 aktualisiert um 21:54:44 Uhr
Goto Top
Hallo,

die anmeldung funktioniert wieder.
Habe die Querys angepasst und frage jetzt mit einem "or" nach PASSWORD() und OLD_PASSWORD().

Werde jetzt mich drum kümmern, das beim Ausloogen das Passwort im 41Byte Hash geschrieben wird.

Danke nochmal für eure Hilfe.


Gruß Marcel