it-swarm.com.de

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

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 bei allen WP -Installationen funktionieren.

19
Brady

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.

In Bezug auf die Verschlüsselungs-/Entschlüsselungsfunktionen 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- starke-verschlüsselung-entschlüsselung-php-funktionen/

 Funktionsverschlüsselung ($ input_string, $ key) {
 $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
 $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_create_iv) und ] $ 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] ($ iv = mcrypt ____.] $ 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

4
marfarma

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, den sein System (WordPress) für die Schnittstelle mit der API verwenden 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 die Authentifizierungsinformationen jedes Mal weiterzugeben.

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

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 einmalund Ihr WordPress.com-Benutzername/Passwort ist niein Ihrer lokalen WordPress-Datenbank gespeichert.

4
EAMann

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 anzuregen, 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:

Jeder Benutzer hat eine geheime Information: 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 ziemlich 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 eine generieren Salted-Hash des Klartext-Benutzerpassworts (mithilfe von wp_hash_password() ), speichern Sie dieses Hash-Passwort als Verschlüsselungsschlüssel an einem privaten Ort, bis sich der Benutzer abmeldet (verwenden Sie den 'wp_logout' hook, um den Schlüssel zu löschen) und verwenden Sie es jedes Mal, wenn wir das Passwort eines Drittanbieters benötigen, um den verschlüsselten Wert in der Datenbank zu entschlüsseln.

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 die Verschlüsselung während 'authenticate' vornimmt. 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 gehashte Passwort zu speichern, kann man stattdessen einen Schlüssel aus dem Sitzungscookie ableiten?
  4. Wer muss mit Passwortänderungen umgehen? Es sieht so aus, als ob es möglich ist, solche Passwortänderungen zu fangen und das Passwort eines Drittanbieters müsste dann mit dem aus dem neuen Passwort abgeleiteten Schlüssel neu verschlüsselt werden.
  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
0
cgogolin