Wie speichere ich Benutzername und Passwort für die API in der WordPress Option DB?

19

Ich entwickle gerade ein Plugin und die Chancen stehen gut, dass ich es höchstwahrscheinlich im öffentlichen Plugin-Repository veröffentlichen werde, damit andere es verwenden können.

Das Plugin verwendet eine API. Um diese API zu verwenden, müssen Sie einen Benutzernamen und ein Kennwort übergeben. Daher muss mein Plugin diese Anmeldeinformationen in der Datenbank speichern. Ich möchte diese nicht im Klartext speichern, obwohl die API sie im Klartext benötigt.

Meine Frage ist also, wie ich diese sensiblen Informationen speichere. Hashing ist out, also muss es eine Art Verschlüsselung sein.

Gibt es in WordPress einen eindeutigen Schlüssel, der von Blog zu Blog unterschiedlich sein kann? Welche PHP-Funktionen soll ich zum Ver- und Entschlüsseln verwenden? Ich suche nach Funktionen, die höchstwahrscheinlich auf allen WP-Installationen funktionieren.

Brady
quelle
3
Das ist irgendwie unlösbar. Es spielt keine Rolle, wie viel Sie verschlüsseln, wenn es reversibel sein muss. Wenn WP es entschlüsseln kann und WP kompromittiert ist, spielt die Verschlüsselung keine Rolle.
Rarst
Aber warum muss Ihre API das Passwort kennen? Reicht es nicht aus, wenn die API weiß, dass der Benutzer das Passwort kennt?
Onetrickpony
1
@One Trick Pony - Das Passwort muss gespeichert werden, damit der Prozess ohne Benutzereingriff automatisiert werden kann.
Brady
1
@Rarst - Mir ist bewusst, dass wenn WP kompromittiert wird, auch die Passwörter. Das kann ich nicht verhindern. Was ich verhindern kann ist, dass wenn ein SQL-Dump erhalten wird, die Passwörter nicht im Klartext sind.
Brady
@Brady yep, wenn nur der SQL- Speicherauszug gefährdet ist, hilft die Verschlüsselung. Ein solches Szenario halte ich jedoch für unwahrscheinlich. Wenn Sie Datenbankzugriff haben, ist es trivial, auch WP zu kompromittieren.
Rarst

Antworten:

4

Ich bin mit den vorherigen Antworten einverstanden. Um die Frage zu beantworten, die Sie tatsächlich gestellt haben, fällt mir ein, eine der folgenden Konstanten für wp-config.php zu verwenden:

define ('AUTH_KEY', 'redigiert');
define ('SECURE_AUTH_KEY', 'redigiert');
define ('LOGGED_IN_KEY', 'redigiert');
define ('NONCE_KEY', 'redigiert');

Sie sollen für alle WordPress-Installationen einzigartig sein - und sind die einzigen Optionen, die in WordPress für bereits vorhandene Schlüssel zur Verfügung stehen. Alternativ können Sie eine eigene ähnliche Konstante hinzufügen, die erstellt wird, indem Sie eine dieser Konstanten mit der Administrator-E-Mail-Adresse oder einer ähnlichen Konstante abgleichen und diese dann in einer verborgenen Einstellungsoption speichern, um zu verhindern, dass Sie Ihren Schlüssel verlieren, wenn jemand versehentlich die Schlüssel nach Ihrer Änderung ändert Plugin ist installiert. Die Gefahr besteht darin, dass der Administrator / Websitebesitzer den Fehler nicht versehentlich verschlüsselt, wenn er bei der Erstinstallation nicht eindeutig festgelegt wurde.

Was die Verschlüsselungs- / Entschlüsselungsfunktionen betrifft, gibt eine schnelle Google-Suche die folgende Auflistung mit dem Code zurück, der zur Rechnung passt: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong- verschlüsselung-entschlüsselung-php-funktionen /

Funktion verschlüsseln ($ input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = Hash ('sha256', $ key, TRUE);
    return base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ h_key, $ input_string, MCRYPT_MODE_ECB, $ iv));
}

Funktion entschlüsseln ($ encrypted_input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = Hash ('sha256', $ key, TRUE);
    return trim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ h_key, base64_decode ($ encrypted_input_string), MCRYPT_MODE_ECB, $ iv));
}

Hier finden Sie eine Dokumentation der hier verwendeten AES-Verschlüsselung: http://www.chilkatsoft.com/p/php_aes.asp

Marfarma
quelle
4

Dies ist genau der Umstand, für den OAuth entwickelt wurde.

Von der OAuth-Homepage :

Für Service Provider Entwickler ...

Wenn Sie unterstützen ...

  • Web Applikationen
  • serverseitige APIs
  • Mashups

Wenn Sie geschützte Daten im Namen Ihrer Benutzer speichern, sollten diese ihre Kennwörter nicht im Internet verbreiten, um Zugriff darauf zu erhalten. Verwenden Sie OAuth, um Ihren Benutzern Zugriff auf ihre Daten zu gewähren und gleichzeitig ihre Kontoanmeldeinformationen zu schützen.

Der Vorteil von OAuth ist, dass Sie das Kennwort des Benutzers nicht speichern müssen. Beim ersten Einrichten des Plugins werden Sie aufgefordert, sich über die Anwendung mit einem Benutzernamen und einem Kennwort anzumelden (normalerweise eine Seite, die auf demselben Server wie die API gehostet und entweder in einer Seitenumleitung, einer Thickbox oder einem Iframe geladen wird). .

Sobald der Benutzer angemeldet ist, erstellt der Server (Ihr System) einen sicheren Schlüssel, mit dem sein System (WordPress) eine Schnittstelle zur API herstellen kann. Dieser Schlüssel ist für das Benutzerkonto und die Site eindeutig - und gibt der Anwendung (in WordPress) die Berechtigung, im Namen des Benutzers Dinge mit der API zu tun, ohne jedes Mal ihre Authentifizierungsinformationen weiterzugeben.

Wenn Sie ein Beispiel dafür in Aktion sehen möchten, schauen Sie sich Jetpack an .

Wenn Sie das Plugin aktivieren, beschwert es sich, dass es nicht verbunden ist. Wenn Sie eine Verbindung herstellen, geben Sie Ihre Anmeldeinformationen über WordPress.com ein und richten die OAuth-Interaktion zwischen WordPress und deren API ein.

Sie müssen dies jedoch nur einmal tun und Ihr WordPress.com-Benutzername / Passwort wird niemals in Ihrer lokalen WordPress-Datenbank gespeichert.

EAMann
quelle
1
Es wäre schön, dies zu verwenden, aber die API, mit der ich es zu tun habe, ist nicht meine und sie haben kein OAuth-System.
Brady
1
In diesem Fall können Sie nur akzeptieren, dass Sie das Kennwort in der Datenbank speichern müssen, und ob Sie es wirklich verschlüsseln oder nicht, macht keinen wesentlichen Unterschied zur Sicherheit. Wie bereits erwähnt, kann jeder, der Zugriff auf WordPress hat (legitim oder gehackt), möglicherweise darauf zugreifen, wenn es sich in der Datenbank befindet und die Verschlüsselung umkehrbar ist.
EAMann
0

Dies ist ein wichtiges Problem, da viele Dienste OAuth immer noch nicht unterstützen und das Speichern von Kennwörtern in der Optionsdatenbank sie für jedes einzelne Wordpress-Plugin lesbar macht (siehe meinen Kommentar oben).

Dies ist (noch) keine echte Antwort auf die Frage, aber auch zu lang für einen Kommentar. Ich hoffe, hiermit eine Diskussion anzustoßen, um die "bestmögliche" Lösung für dieses "unlösbare" Problem zu finden.

Die Grundidee, die mich denken lässt, dass das Verschlüsseln von Passwörtern möglich ist, ist folgende:

Es gibt eine geheime Information, die jeder Benutzer hat: sein Wordpress-Passwort. Es sollte möglich sein, Anmeldeinformationen für Dienste von Drittanbietern zu speichern, die mit einem geheimen, von diesem Kennwort abgeleiteten Kennwort verschlüsselt sind, und diese nur zu entschlüsseln, wenn der Benutzer angemeldet ist.

Auf diese Weise sollte es zumindest unmöglich sein, die Passwörter aus einer Kopie der Wordpress-Dateien und -Datenbank zu stehlen. Es kann nicht das Problem lösen, dass andere Plugins Anmeldeinformationen stehlen, da jedes Plugin das Klartextkennwort während der Anmeldung erfassen kann.

Die eigentliche Entschlüsselung ist recht einfach: Angenommen, wir haben bereits eine verschlüsselte Version des Drittanbieter-Dienstes in der Datenbank gespeichert, können den 'authenticate'Filter einbinden oder durch Überschreiben der wp_authenticate()Funktion einen gesalzenen Hash des Klartext-Benutzerpassworts (von) generieren Mittel von wp_hash_password()), speichern Sie dieses gehashte Kennwort als Verschlüsselungsschlüssel an einem privaten Ort, bis sich der Benutzer abmeldet (verwenden Sie den 'wp_logout'Haken, um den Schlüssel zu löschen), und verwenden Sie ihn jedes Mal, wenn Sie das Kennwort eines Drittanbieters zum Entschlüsseln des verschlüsselten Werts in der Datenbank benötigen.

Während ich das Gefühl habe, dass es möglich sein sollte, diese Arbeit zu machen, gibt es jedoch einige ungelöste Probleme:

  1. Wie erfolgt die Verschlüsselung? Möglicherweise könnte man das Klartext-Passwort speichern, bis sich der Benutzer ab- und wieder anmeldet und währenddessen die Verschlüsselung vornimmt 'authenticate'. Der Benutzer könnte aufgefordert werden, sich anzumelden, um den Zeitraum bis dahin kurz zu halten.
  2. Wo soll der Schlüssel aufbewahrt werden und wie kann er beim Abmelden gelöscht werden? Verstehe ich richtig, dass 'authenticate'nur ausgeführt wird, wenn sich der Benutzer tatsächlich anmeldet?
  3. Falls es jetzt möglich ist, das Hash-Passwort zu speichern, kann man stattdessen einen Schlüssel aus dem Sitzungscookie ableiten?
  4. Wer muss mit Passwortänderungen umgehen? Es sieht aus wie es möglich ist, fängt solche Passwort - Änderungen und das von Drittanbietern Passwort dann mit dem Schlüssel aus dem neuen Passwort abgeleitet wird wieder verschlüsselt hat.
  5. Gibt es eine Möglichkeit, Unterstützung für mehrere Benutzer bereitzustellen? Im Idealfall möchte man, dass ein Administrator in der Lage ist, Kennwörter von Drittanbietern in den Einstellungen festzulegen, die dann von weniger privilegierten Benutzern zur Interaktion mit Diensten von Drittanbietern verwendet werden können, im Idealfall sogar ohne Offenlegung dieser Kennwörter. Zu diesem Zweck muss der Administrator in der Lage sein, einen Schlüssel für alle Benutzer zu generieren, den diese anderen Benutzer nur für sich selbst generieren können. Ist das irgendwie möglich
CGOGOLIN
quelle