web-dev-qa-db-fra.com

Comment enregistrer le nom d'utilisateur et le mot de passe de l'API dans l'option wordpress de DB?

Je développe actuellement un plugin et il est fort probable que je le publierai sur le référentiel de plugins public pour que d'autres puissent l'utiliser.

Le plugin utilisera une API et pour utiliser cette API, vous devez passer un nom d'utilisateur et un mot de passe. Mon plugin doit donc stocker ces informations de connexion dans la base de données. Je ne veux pas les stocker en texte brut, même si l'API en a besoin.

Ma question est donc la suivante: comment stocker ces informations sensibles? Le hachage est terminé, il doit donc s'agir d'une sorte de cryptage.

Dans WordPress, existe-t-il une clé unique pouvant être utilisée qui diffère d'un blog à l'autre? Quelles fonctions php dois-je utiliser pour chiffrer et déchiffrer? Je recherche des fonctions qui fonctionneront très probablement sur toutes les WP installations.

19
Brady

Bien que je sois d’accord avec les réponses précédentes, pour répondre à la question que vous avez réellement posée, ce qui me vient à l’esprit est d’utiliser une de ces constantes pour wp-config.php:

 définir ('AUTH_KEY', 'expurgé'); 
 définir ('SECURE_AUTH_KEY', 'expurgé'); 
 définir ('LOGGED_IN_KEY', 'expurgé'); 
 définir ('NONCE_KEY', 'expurgé'); 

Elles sont censées être uniques à travers les installations wordpress - et sont les seules options pour les clés préexistantes disponibles dans wordpress. Une autre solution serait d’ajouter votre propre constante similaire construite en hachant l’une d’entre elles contre l’adresse électronique de l’administrateur ou une adresse similaire, puis en la stockant dans une option de réglage masquée, pour vous protéger contre la perte de votre clé si quelqu'un modifiait accidentellement les clés après votre modification. Le plugin est installé. Le danger est que, s'ils ne sont pas uniques au moment de l'installation initiale, mais que l'administrateur/le propriétaire du site décide de rectifier la panne après coup, il ne devrait pas accidentellement rompre le cryptage de votre mot de passe.

En ce qui concerne les fonctions de cryptage/décryptage - une recherche rapide dans Google renvoie la liste suivante avec un code qui semble correspondre à la facture: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and- cryptage fort-décryptage-fonctions-php/

 fonction chiffrée ($ input_string, $ key) {
 $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
 $ iv = mcrypt_create_iv ($ iv_size, MCRYPT) ] $ h_key = hash ('sha256', $ key, TRUE); 
 return base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ h_key, $ input_string, MCRYPT_MODE_ECB, $ iv)); 
}. .] 
 fonction decrypt ($ encrypted_input_string, $ key) {
 $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
 $ iv = mcrypt_create_iv (écran). ____.] $ h_key = hash ('sha256', $ key, TRUE); 
 renvoyer trim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ h_key, base64_decode ($ encrypted_input_string), MCRYPT_MODE_ECB, $ iv)); ]} 

Voici une documentation du cryptage AES utilisé ici: http://www.chilkatsoft.com/p/php_aes.asp

4
marfarma

C'est exactement la circonstance pour laquelle OAuth a été conçu.

De la page d'accueil OAuth :

Pour les développeurs de fournisseurs de services ...

Si vous soutenez ...

  • des applications Web
  • aPI côté serveur
  • mashups

Si vous stockez des données protégées pour le compte de vos utilisateurs, ceux-ci ne doivent pas diffuser leurs mots de passe sur le Web pour pouvoir y accéder. Utilisez OAuth pour permettre à vos utilisateurs d'accéder à leurs données tout en protégeant les informations d'identification de leur compte.

L'avantage d'OAuth est que vous n'avez pas besoin de stocker le mot de passe de l'utilisateur. Lors de la première installation du plug-in, il leur est demandé de se connecter avec un nom d'utilisateur et un mot de passe via l'application (généralement une page hébergée sur le même serveur que l'API et chargée dans une redirection de page, une zone épaisse ou un iframe). .

Une fois l'utilisateur connecté, le serveur (votre système) crée une clé sécurisée que son système (WordPress) peut utiliser pour se connecter à l'API. Cette clé est unique pour le compte d'utilisateur et le site - et elle donne à l'application (sur WordPress) le droit de faire certaines choses avec l'API pour le compte de l'utilisateur sans transmettre leurs informations d'authentification à chaque fois.

Si vous voulez voir un exemple de cela en action, consultez Jetpack .

Lorsque vous activez le plug-in, il se plaint de ne pas être connecté. Lorsque vous le "connectez", vous entrez vos informations d'identification via WordPress.com et configurez l'interaction OAuth entre WordPress et leur API.

Mais il vous suffit de faire cela une fois et votre nom d'utilisateur/mot de passe WordPress.com est jamais enregistré dans votre base de données WordPress locale.

4
EAMann

C'est un problème important, car de nombreux services ne prennent toujours pas en charge OAuth et le stockage des mots de passe dans la base de données des options les rend lisibles pour chaque plugin Wordpress (voir mon commentaire ci-dessus).

Ce n'est pas (encore) une vraie réponse à la question, mais c'est trop long pour un commentaire. J'espère susciter une discussion avec cela dans le but de trouver la "meilleure" solution possible à ce problème "insoluble".

L'idée de base qui me fait penser que le cryptage des mots de passe est possible est la suivante:

Chaque utilisateur possède une information secrète: son mot de passe Wordpress. Il devrait être possible de stocker les informations d'identification sur des services tiers chiffrés avec un formulaire dérivé secret qui utilise ce mot de passe et de les déchiffrer uniquement lorsque l'utilisateur est connecté.

De cette manière, il devrait être possible au moins d'empêcher le vol des mots de passe d'une copie des fichiers Wordpress et de la base de données. Cela ne résoudra pas le problème du vol d'informations d'identification par d'autres plugins, car chaque plugin peut capturer le mot de passe en texte brut lors de la connexion.

En fait, le déchiffrement est assez facile à faire: supposons que nous ayons déjà une version chiffrée du service tiers stockée dans la base de données, nous pouvons nous connecter au filtre 'authenticate' ou en écrasant la fonction wp_authenticate() , générer un mot de passe salé du mot de passe utilisateur en texte brut (à l’aide de wp_hash_password() ), enregistrez ce mot de passe en tant que clé de cryptage jusqu’à ce que l’utilisateur se déconnecte (utilisez le 'wp_logout' hook pour supprimer la clé) chaque fois que nous avons besoin du mot de passe tiers pour déchiffrer la valeur chiffrée de la base de données.

Bien que j’ai le sentiment qu’il devrait être possible de faire fonctionner cela, il existe cependant plusieurs problèmes non résolus:

  1. Comment faire le cryptage? Potentiellement, vous pouvez stocker le mot de passe en texte brut jusqu'à ce que l'utilisateur se déconnecte et se reconnecte à nouveau, puis effectue le cryptage pendant 'authenticate'. L'utilisateur peut être invité à se connecter pour conserver la période jusqu'à ce que cela se produise.
  2. Où stocker la clé et comment la supprimer lors de la déconnexion? Dois-je bien comprendre que 'authenticate' n'est exécuté que lorsque l'utilisateur se connecte réellement?
  3. Au cas où il y aurait moyen de stocker le mot de passe haché, on pourrait peut-être obtenir une clé à partir du cookie de session.
  4. Qui gérer les changements de mot de passe? Il semble qu'il soit possible de rattraper ces modifications de mot de passe, et le mot de passe tiers devrait alors être rechiffré avec la clé dérivée du nouveau mot de passe.
  5. Existe-t-il un moyen de fournir une assistance multi-utilisateurs? Idéalement, on voudrait qu'un utilisateur administrateur puisse définir des mots de passe tiers dans des paramètres pouvant être utilisés par des utilisateurs moins privilégiés pour interagir avec des services tiers, idéalement même sans leur divulguer ces mots de passe. Pour cela, l'utilisateur admin devrait pouvoir générer une clé pour tous les utilisateurs que ces autres utilisateurs ne peuvent générer que pour eux-mêmes. Est-ce que c'est possible?
0
cgogolin