Aktuelle Details zum Passwort-Speichersystem von Discourse finden Sie unter discourse/docs/SECURITY.md at main · discourse/discourse · GitHub. Zum Zeitpunkt des Schreibens verwenden wir PBKDF2-SHA256 mit 600.000 Iterationen.
In einigen Fällen möchten Sie möglicherweise alle gehashten Passwörter aus Discourse exportieren und in ein anderes System importieren. Beispielsweise könnten Sie von der integrierten Discourse-Authentifizierung zu einem benutzerdefinierten SSO-System migrieren. Denken Sie daran, dass es unmöglich ist, die ursprünglichen Passwörter aus der Datenbank zu extrahieren. Daher muss Ihr Zielsystem in der Lage sein, denselben Hashing-Algorithmus mit denselben Parametern auszuführen.
Passwortdaten werden in der Tabelle user_passwords gespeichert, die die Spalten password_hash, password_salt und password_algorithm enthält. Die Spalte password_algorithm speichert das vollständige PHC-Algorithmus-Präfix (z. B. $pbkdf2-sha256$i=600000,l=32$), das je Benutzer variieren kann, wenn die Iterationsanzahl im Laufe der Zeit erhöht wurde.
Sie können den Data Explorer verwenden, um die Informationen in einem für Computer lesbaren Format zu exportieren:
SELECT users.id, users.username, up.password_salt, up.password_hash, up.password_algorithm
FROM users
INNER JOIN user_passwords up ON users.id = up.user_id
WHERE users.id > 0
Dies exportiert die Daten im nativen Discourse-Format. Der Salt ist hexadezimal kodiert, und der Passwort-Hash ist ebenfalls hexadezimal kodiert.
Einige externe Systeme unterstützen das PHC-String-Format, das eine algorithmusübergreifende Darstellung des Outputs einer Passwort-Hashing-Funktion ermöglicht. Für pbkdf2-sha256 enthält dieser String den Algorithmentyp, die Anzahl der Iterationen, den base64-kodierten Salt und den base64-kodierten Hash. Glücklicherweise kann Postgres dies alles für uns in einer einzigen Abfrage erledigen.
Um PHC-Strings für jeden Discourse-Benutzer zu generieren, können Sie eine Data-Explorer-Abfrage wie diese verwenden:
SELECT users.id, users.username,
concat(
up.password_algorithm,
replace(encode(up.password_salt::bytea, 'base64'), '=', ''),
'$',
replace(encode(decode(up.password_hash, 'hex'), 'base64'), '=', '')
) as phc
FROM users
INNER JOIN user_passwords up ON users.id = up.user_id
WHERE users.id > 0
Wenn Sie Auth0 verwenden, benötigen Sie stattdessen Folgendes:
SELECT
user_emails.email,
users.active as email_verified,
concat(
up.password_algorithm,
replace(encode(up.password_salt::bytea, 'base64'), '=', ''),
'$',
replace(encode(decode(up.password_hash, 'hex'), 'base64'), '=', '')
) as password_hash
FROM users
INNER JOIN user_passwords up ON users.id = up.user_id
INNER JOIN user_emails
ON users.id = user_emails.user_id
AND user_emails.primary IS TRUE
AND users.id > 0