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

18

Je suis en train de développer un plugin et il y a de grandes chances que je le publie sur le référentiel public du plugin 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 souhaite 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'un cryptage.

Existe-t-il une clé unique utilisable dans WordPress 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 installations de WP.

    
posée Brady 05.08.2011 - 14:48

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

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

Elles se veulent uniques parmi les installations WordPress - et constituent l’unique option des 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, afin de 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 rompre accidentellement 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: enlace

function 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);
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $h_key, $input_string, MCRYPT_MODE_ECB, $iv));
}

function 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);
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $h_key, base64_decode($encrypted_input_string), MCRYPT_MODE_ECB, $iv));
}

Voici une documentation du chiffrement AES utilisé ici: enlace

    
réponse donnée marfarma 13.08.2011 - 02:47
4

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

À partir de la page d'accueil OAuth :

  

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

     

Si vous soutenez ...

     
  • 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 qu'il n'est pas nécessaire 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 boîte é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 assurer l'interface avec l'API. Cette clé est unique pour le compte d'utilisateur et le site - et elle donne à l'application (sous WordPress) le droit de faire quelque chose avec l'API pour le compte de l'utilisateur sans transmettre à chaque fois ses informations d'authentification.

Si vous souhaitez 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 saisissez vos informations d'identification via WordPress.com et configurez l'interaction OAuth entre WordPress et leur API.

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

    
réponse donnée EAMann 05.08.2011 - 15:38
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 des options les rend lisibles pour tous les plugins 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 dans ce but, dans le but de proposer 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 de rendre impossible 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 réalité, 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' ou en écrasant la fonction wp_authenticate() , générer une valeur salée hash du mot de passe de l'utilisateur en texte brut (à l'aide de wp_hash_password() ), stocke ce mot de passe haché comme clé de cryptage quelque part dans un emplacement privé jusqu'à ce que l'utilisateur se déconnecte (utilisez le 'wp_logout' pour supprimer la clé) et utilisez-le chaque fois que nécessaire. le mot de passe tiers permettant de 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 fonctionner ce travail, 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 effectuez le chiffrement pendant 'authenticate' . L'utilisateur peut être invité à se connecter pour conserver le délai 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 serait possible de stocker le mot de passe haché, on pourrait peut-être dériver une clé du cookie de session?
  4. Qui doit gérer les changements de mot de passe? Il semblerait qu'il soit possible de de saisir
  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?
réponse donnée cgogolin 05.09.2018 - 10:50

Lire d'autres questions sur les étiquettes