Comment stocker le nom d'utilisateur et le mot de passe dans l'API dans la base de données d'options wordpress?


19

Je suis en train de développer un plugin et il y a de fortes chances que je le libère plus que probablement sur le dépôt public de plugins 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 bien que l'API en ait besoin en texte brut.

Ma question est donc de savoir 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 qui peut être utilisée et qui diffère d'un blog à l'autre? Quelles fonctions php dois-je utiliser pour crypter et décrypter? Je recherche des fonctions qui fonctionneront plus que probablement sur toutes les installations WP.


3
C'est un peu insoluble. Peu importe combien vous cryptez si elle doit être réversible. Si WP peut le décrypter et que WP est compromis, le cryptage n'a pas d'importance.
Rarst

Mais pourquoi votre API doit-elle connaître le mot de passe? N'est-ce pas suffisant si l'API sait que l'utilisateur connaît le mot de passe?
onetrickpony

1
@One Trick Pony - Le mot de passe doit être stocké pour que le processus puisse être automatisé sans intervention de l'utilisateur.
Brady

1
@Rarst - Je sais que si WP est compromis, les mots de passe le sont aussi. Je ne peux pas empêcher cela. Ce que je peux empêcher, c'est que si un vidage SQL est obtenu, les mots de passe ne sont pas en texte brut.
Brady

@Brady yep, si seul le vidage SQL est compromis, le cryptage serait utile. Cependant, je trouve un tel scénario peu probable. Si vous avez accès à la base de données, il est également inutile de compromettre WP.
Rarst

Réponses:


4

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 l'une de ces constantes pour wp-config.php:

define ('AUTH_KEY', 'caviardé');
define ('SECURE_AUTH_KEY', 'caviardé');
define ('LOGGED_IN_KEY', 'caviardé');
define ('NONCE_KEY', 'caviardé');

Ils sont censés être uniques dans les installations wordpress - et sont les seules options pour les clés préexistantes à trouver dans wordpress. Une autre alternative serait d'ajouter votre propre constante similaire qui est construite en hachant l'une d'entre elles contre l'adresse e-mail de l'administrateur ou similaire - puis en la stockant dans une option de paramètre caché - pour vous protéger contre la perte de votre clé si quelqu'un modifie accidentellement les clés après votre le plugin est installé. Le danger est que s'ils ne sont pas rendus uniques lors de l'installation initiale, mais que l'administrateur / le propriétaire du site décide de rectifier la panne après coup, il ne doit pas accidentellement casser le cryptage de votre mot de passe.

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

fonction encrypt ($ 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);
    retourner 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 ($ iv_size, MCRYPT_RAND);
    $ h_key = hash ('sha256', $ key, TRUE);
    retour 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

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

Depuis 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 au nom de vos utilisateurs, ils ne devraient pas diffuser leurs mots de passe sur le Web pour 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 configuration 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 soit dans une redirection de page, une boîte épaisse ou une 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 s'interfacer avec l'API. Cette clé est unique pour le compte d'utilisateur et le site - et elle donne à l'application (sur WordPress) l'autorisation de faire des choses avec l'API au nom de l'utilisateur sans passer à chaque fois ses informations d'authentification.

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

Lorsque vous activez le plugin, il se plaint qu'il n'est pas 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 vous ne devez le faire qu'une seule fois et votre nom d'utilisateur / mot de passe WordPress.com n'est jamais stocké dans votre base de données WordPress locale.


1
Ce serait bien de l'utiliser, mais l'API avec laquelle je traite n'est pas la mienne et ils n'ont pas de système OAuth en place.
Brady

1
Dans ce cas, votre seule véritable option est d'accepter que vous devez stocker le mot de passe dans la base de données et que vous le chiffriez ou non, cela ne fait pas vraiment de différence avec la sécurité. Comme d'autres l'ont mentionné ci-dessus, s'il se trouve dans la base de données et que le cryptage est réversible, toute personne ayant accès à WordPress (légitime ou piraté) pourrait en théorie s'en emparer.
EAMann

0

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 d'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 aussi trop longue pour un commentaire. J'espère susciter une discussion à ce sujet, 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 des informations d'identification sur des services tiers chiffrés avec une forme dérivée secrète de ce mot de passe et de les déchiffrer uniquement lorsque l'utilisateur est connecté.

De cette façon, il devrait être possible de rendre au moins impossible de voler les mots de passe d'une copie des fichiers et de la base de données Wordpress. Il ne peut pas résoudre le problème des autres plugins volant des informations d'identification, 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 'authenticate'filtre ou en écrasant la wp_authenticate()fonction, générer un hachage salé du mot de passe utilisateur en texte brut (par moyen wp_hash_password()), stockez ce mot de passe haché comme clé de chiffrement dans un endroit privé jusqu'à ce que l'utilisateur se déconnecte (utilisez le 'wp_logout'crochet pour supprimer la clé) et utilisez-le chaque fois que nous avons besoin du mot de passe tiers pour déchiffrer la valeur chiffrée dans la base de données.

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

  1. Comment faire le cryptage? Potentiellement, on pourrait stocker le mot de passe en texte brut jusqu'à ce que l'utilisateur se déconnecte et se reconnecte et 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? Est-ce que je comprends bien que ce 'authenticate'n'est exécuté que lorsque l'utilisateur se connecte réellement?
  3. Dans le cas où il existe maintenant un moyen de stocker le mot de passe haché, peut-être que l'on peut à la place dériver une clé du cookie de session?
  4. Qui gérer les modifications de mot de passe? Il semble qu'il soit possible de détecter de tels changements 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 les paramètres qui peuvent ensuite être poursuivis 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 administrateur devrait pouvoir générer des clés pour tous les utilisateurs que ces autres utilisateurs ne peuvent générer que pour eux-mêmes. Est-ce possible d'une manière ou d'une autre?
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.