Como armazenar nome de usuário e senha na API na opção DB do wordpress?

19

No momento, estou desenvolvendo um plug-in e as chances são de que provavelmente o lançarei no repositório público de plugins para que outros possam usá-lo.

O plug-in usará uma API e, para usá-la, é necessário passar um nome de usuário e senha. Portanto, meu plug-in precisa armazenar essas credenciais de login no banco de dados. Não quero armazená-los em texto sem formatação, embora a API precise deles em texto sem formatação.

Então, minha pergunta é como faço para armazenar essas informações sensíveis? O hash está fora do ar, portanto, deve haver algum tipo de criptografia.

No WordPress, existe uma chave única que pode ser usada que será diferente de blog para blog? Quais funções php devo usar para criptografar e descriptografar? Estou procurando por funções que provavelmente funcionarão em todas as instalações do WP.

Brady
fonte
3
Isso é meio insolúvel. Não importa o quanto você criptografa, se precisar ser reversível. Se o WP pode descriptografá-lo e o WP estiver comprometido, a criptografia não importa.
Rarst
Mas por que sua API precisa saber a senha? Não é suficiente se a API souber que o usuário conhece a senha?
Onetrickpony
1
@ One Trick Pony - A senha precisa ser armazenada para que o processo possa ser automatizado sem a intervenção do usuário.
Brady
1
@Rarst - Estou ciente de que, se o WP estiver comprometido, o mesmo ocorre com as senhas. Eu não posso impedir isso. O que posso evitar é que, se um dump SQL for obtido, as senhas não estejam em texto sem formatação.
Brady
@ Brad sim, se apenas o dump SQL for comprometido, a criptografia ajudaria. No entanto, acho esse cenário improvável. Se você tiver acesso ao banco de dados, é trivial comprometer o WP também.
Rarst

Respostas:

4

Embora eu concorde com as respostas anteriores, para responder à pergunta que você realmente fez, o que vem à mente é usar uma dessas constantes para o wp-config.php:

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

Eles devem ser únicos nas instalações do wordpress - e são as únicas opções para chaves pré-existentes encontradas no wordpress. A alternativa seria adicionar sua própria constante semelhante, criada com hash de uma delas no endereço de e-mail do administrador ou similar - e depois armazená-la em uma opção de configuração oculta - para proteger contra a perda de sua chave se alguém acidentalmente modificá-las após o seu plugin está instalado. O perigo é que, se eles não foram tornados únicos na instalação inicial, mas o administrador / proprietário do site decide corrigir a falha após o fato, eles não devem quebrar acidentalmente a criptografia da senha.

Quanto às funções de criptografia / descriptografia - uma pesquisa rápida no Google retorna a seguinte listagem com o código que parece ser adequado à conta: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong- funções de criptografia-decriptografia-php /

função 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', $ chave, VERDADEIRO);
    retornar base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ h_key, $ input_string, MCRYPT_MODE_ECB, $ iv));
}

descriptografar a função ($ 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', $ chave, VERDADEIRO);
    return trim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ h_key, base64_decode ($ encrypted_input_string), MCRYPT_MODE_ECB, $ iv));
}

Aqui está uma documentação da criptografia AES usada aqui: http://www.chilkatsoft.com/p/php_aes.asp

Marfarma
fonte
4

Essa é exatamente a circunstância para a qual o OAuth foi projetado.

Na página inicial do OAuth :

Para desenvolvedores de provedores de serviços ...

Se você está apoiando ...

  • Aplicativos da web
  • APIs do servidor
  • mashups

Se você estiver armazenando dados protegidos em nome de seus usuários, eles não deverão espalhar suas senhas pela Web para obter acesso a eles. Use o OAuth para dar aos usuários acesso aos dados deles, protegendo as credenciais da conta.

A vantagem do OAuth é que você não precisa armazenar a senha do usuário. Quando eles configuram o plug-in pela primeira vez, eles são solicitados a fazer login com um nome de usuário e senha por meio do aplicativo (geralmente uma página hospedada no mesmo servidor que a API e carregada em um redirecionamento de página, em uma caixa espessa ou em um iframe) .

Após o login do usuário, o servidor (seu sistema) cria uma chave segura que seu sistema (WordPress) pode usar para fazer interface com a API. Essa chave é exclusiva da conta do usuário e do site - e dá ao aplicativo (no WordPress) permissão para fazer coisas com a API em nome do usuário, sem passar suas informações de autenticação todas as vezes.

Se você quiser ver um exemplo disso em ação, confira o Jetpack .

Quando você ativa o plug-in, ele reclama que não está conectado. Quando você o "conecta", insere suas credenciais no WordPress.com e configura a interação OAuth entre o WordPress e a API deles.

Mas você só precisa fazer isso uma vez e seu nome de usuário / senha do WordPress.com nunca são armazenados no banco de dados local do WordPress.

EAMann
fonte
1
Seria bom usar isso, mas a API com a qual estou lidando não é minha e eles não têm um sistema OAuth em vigor.
Brady5 /
1
Nesse caso, sua única opção real é aceitar que você precisa armazenar a senha no banco de dados e se criptografar ou não ela realmente não difere substancialmente da segurança. Como já mencionado acima, se estiver no banco de dados e a criptografia for reversível, qualquer pessoa com acesso ao WordPress (legítimo ou hackeado) poderá se apossar dele.
EAMann
0

Esta é uma questão importante, pois muitos serviços ainda não oferecem suporte ao OAuth e o armazenamento de senhas no banco de dados de opções as torna legíveis para todos os plugins do Wordpress (veja meu comentário acima).

Essa ainda não é uma resposta real à pergunta, mas também é muito longa para um comentário. Espero iniciar uma discussão com isso, com o objetivo de encontrar a "melhor" solução possível para esse problema "insolúvel".

A idéia básica que me faz pensar que a criptografia de senhas é possível é a seguinte:

Há uma informação secreta que todo usuário possui: sua senha do Wordpress. Deve ser possível armazenar credenciais em serviços de terceiros criptografados com um formulário derivado secreto que senha e somente descriptografá-los quando o usuário estiver conectado.

Dessa forma, deve ser possível pelo menos tornar impossível roubar as senhas de uma cópia dos arquivos e do banco de dados do Wordpress. Ele não pode resolver o problema de outros plug-ins que roubam credenciais, porque cada plug-in pode capturar a senha de texto sem formatação durante o login.

Na verdade, é muito fácil descriptografar: suponha que já tenhamos uma versão criptografada do serviço de terceiros armazenada no banco de dados, podemos conectar-se ao 'authenticate'filtro ou sobrescrever a wp_authenticate()função, gerar um hash salgado da senha do usuário em texto sem formatação (por meios de wp_hash_password()), armazene o hash da senha como uma chave de criptografia em algum lugar privado até que o usuário efetue logout (use o 'wp_logout'gancho para excluir a chave) e use-a sempre que precisarmos da senha de terceiros para descriptografar o valor criptografado no banco de dados.

Embora eu ache que deve ser possível fazer isso funcionar, existem vários problemas não resolvidos:

  1. Como fazer a criptografia? Potencialmente, pode-se armazenar a senha em texto sem formatação até que o usuário efetue logout e logon novamente e faça a criptografia durante 'authenticate'. O usuário pode ser solicitado a fazer login para manter o período até que isso aconteça.
  2. Onde armazenar a chave e como excluí-la durante o logout? Entendo corretamente que 'authenticate'só é executado quando o usuário efetua login?
  3. Caso agora haja uma maneira de armazenar a senha com hash, talvez seja possível derivar uma chave do cookie da sessão?
  4. Quem manipular as alterações de senha? Parece que é possível capturar essas alterações de senha e a senha de terceiros precisaria ser criptografada novamente com a chave derivada da nova senha.
  5. Existe uma maneira de fornecer suporte multiusuário? O ideal seria que um usuário administrador pudesse definir senhas de terceiros nas configurações que podem ser processadas por usuários menos privilegiados para interagir com serviços de terceiros, idealmente mesmo sem revelar essas senhas. Para isso, o usuário administrador precisa ser capaz de gerar chaves para todos os usuários que esses outros usuários podem gerar apenas para si mesmos. Isso é de alguma forma possível?
cgogolin
fonte