Benutzer importieren (Password Hash)
-
Hallo Freunde,
es geht mir um folgendes Thema.
Ich stelle eine Homepage von TYPO3 zu WordPress um, soweit so gut. Die Nutzer in TYPO3 werden mit dem Passwort-Hash (BCRYPT) gehasht.
In WordPress hingegen mit PHPASS.
Durch ein PHP-Script konnte ich den Hash-Algorithmus erfolgreich auf Bcrypt ändern. Jedoch kann ich mich mit den Nutzern aus TYPO3 nicht in WordPress anmelden.
Wer von euch kann mir bei dieser Problematik behilflich sein?
-
Da wir das PHP-Skript nicht kennen, ist deine Frage schwer zu beantworten.
WordPress verwendet zwar den „schwachen“ MD5-Hash, der aber mit den in der
wp-config.php
eingetragenen SALT-Keys mehrfach gehasht wird, damit Passwörter nicht anhand von Rainbow-Tabellen ermittelt werden können. Ich könnte mir vorstellen, dass das hier eine Rolle spielt.Was wäre, wenn du eines der bcrypt-Plugins für WordPress verwendest?
Vielen Dank für die schnelle Antwort.
Anbei das Script.
Probiere derweil die Methode über Typo3 zu ändern.
<?php
/**- Plugin Name: Password bcrypt
- Version: 1.0.3
- Description: Replaces wp_hash_password and wp_check_password with PHP 5.5’s password_hash and password_verify.
- Plugin URI: https://roots.io
- Licence: MIT
- Author: Roots
- Author URI: https://roots.io
*/
if ( ! function_exists( ‚add_filter‘ ) ) {
header( ‚Status: 403 Forbidden‘ );
header( ‚HTTP/1.1 403 Forbidden‘ );
exit();
}if ( version_compare( phpversion(), ‚5.5‘, ‚>=‘ )
&& ! function_exists( ‚wp_check_password‘ )
&& ! function_exists( ‚wp_hash_password‘ )
&& ! function_exists( ‚wp_set_password‘ )
) :define( ‚WP_OLD_HASH_PREFIX‘, ‚$P$‘ );
/**
- Check if user has entered correct password, supports bcrypt and pHash.
* - @param string $password Plaintext password
- @param string $hash Hash of password
- @param int|string $user_id ID of user to whom password belongs
- @return mixed|void
* - @suppresswarnings(PHPMD.CamelCaseVariableName) $wp_hasher is a global variable, we cannot change its name
*/
function wp_check_password( $password, $hash, $user_id = “ ) { if ( 0 === strpos( $hash, WP_OLD_HASH_PREFIX ) ) {
global $wp_hasher;if ( empty( $wp_hasher ) ) { require_once( ABSPATH . WPINC . '/class-phpass.php' );$wp_hasher = new PasswordHash( 8, true );} $check = $wp_hasher->CheckPassword( $password, $hash ); if ( $check && $user_id ) { $hash = wp_set_password( $password, $user_id ); }
} $check = password_verify( $password, $hash ); return apply_filters( ‚check_password‘, $check, $password, $hash, $user_id );
}
/**
- Hash password using bcrypt
* - @param string $password Plaintext password
- @return bool|string
*/
function wp_hash_password( $password ) { $options = apply_filters( ‚wp_hash_password_options‘, [] ); return password_hash( $password, PASSWORD_DEFAULT, $options );
}
/**
- Set password using bcrypt
* - @param string $password Plaintext password
- @param int $user_id ID of user to whom password belongs
- @return bool|string
*/
function wp_set_password( $password, $user_id ) { /** @var \wpdb $wpdb */
global $wpdb; $hash = wp_hash_password( $password ); $wpdb->update( $wpdb->users, [ ‚user_pass‘ => $hash, ‚user_activation_key‘ => “ ], [ ‚ID‘ => $user_id ] );
wp_cache_delete( $user_id, ‚users‘ ); return $hash;
}
endif;
Hier im Supportforum bieten wir vor allem Anwendungssupport an, während Fragen zur Programmierung auf WordPress Stackexchange besser aufgehoben sind. Ganz kurz:
- Deine Methode, um den direkten Skriptaufruf durch setzen eines Headers zu verhindern, scheint so nicht zu funktionieren.
- Die Funktion
wp_check_password()
ist bereits im Core vorhanden. Der nachfolgende Code sollte dann doch gar nicht erst ausgeführt werden? - Der Abgleich
if ( 0 === strpos( $hash, WP_OLD_HASH_PREFIX ) )
prüft, ob das Passwort in der Datenbank mit$P$
beginnt. Das muss es aber nicht – du kannst auch einen einfachen MD5-Hash eintragen, um z.B. das Passwort zurückzusetzen.
Mir wird beim Überfliegen des Codes auch nicht klar, wo hier eine Speicherung eines neuen Benutzerpassworts per bycrypt erfolgen soll.
Wie gesagt: am besten fragst du mal auf WordPress Stackexchange nach.
—
Nachtrag: offensichtlich handelt es sich um Code des zuletzt vor 8 Jahren aktualisierten Plugins Password bcrypt. Die von mir angesprochenen Punkte lassen sich alle irgendwie klären – nutzen würde ich dieses Plugin aber nicht mehr.
- Diese Antwort wurde geändert vor 4 Monaten, 3 Wochen von Bego Mario Garde.
- Diese Antwort wurde geändert vor 4 Monaten, 3 Wochen von Bego Mario Garde.
Hashes sind Einwegfunktionen. Es ist unmöglich, aus einem Hash das Passwort zu erhalten, wäre ja auch schlimm. Außer es ist ein schwaches Passwort, dann könnte man es durch Probieren erraten. Es wird dir also nichts anderes übrig bleiben, als wie Bego vorgeschlagen hat, eines der bcrypt-Plugins für WordPress zu verwenden oder deine Nutzer zu bitten, ein neues Passwort einzugeben.
Es ist unmöglich, aus einem Hash das Passwort zu erhalten, wäre ja auch schlimm.
Nun ja, das stimmt nicht für alle Passwörter?
→ https://de.wikipedia.org/wiki/Rainbow_TableNa gut. Ich habe schon mehrmals Umzüge meiner Nutzer von a nach b (nicht WordPress) durchgeführt. Entweder ich habe den Hash (bei gleichem Hash-Algorithmus) kopieren können, oder die Nutzer mussten ein neues Passwort setzen.
Zurück zum Thema, es ging ja nicht um die (latenten) Unsicherheit von MD5-Hashes, sondern die Frage, ob man einfach eine Liste von Benutzern und bcrypt-Hashes importieren kann. Mit dem o.g. Plugin scheint das so nicht zu funktionieren.
- Du musst angemeldet sein, um auf dieses Thema zu antworten.