web-dev-qa-db-ja.com

ユーザー名とパスワードをワードプレスオプションDBのAPIに保存するにはどうすればいいですか?

私は現在プラグインを開発中です。他の人が使用できるように、おそらく公共のプラグインレポジトリでリリースする予定です。

プラグインはAPIを使用します。このAPIを使用するには、ユーザー名とパスワードを渡す必要があります。だから私のプラグインはデータベースにこれらのログイン資格情報を保存する必要があります。 APIはプレーンテキストでそれらを必要としますが、私はプレーンテキストでこれらを保存したくありません。

それで、私の質問はこれらの機密情報をどうやって保存するのかということです。ハッシュは無効になっているので、何らかの暗号化が必要です。

WordPressでは、ブログごとに異なる固有のキーを使用できますか。暗号化と復号化にはどのphp関数を使うべきですか?私はすべてのWPインストールでおそらくうまくいくような機能を探しています。

19
Brady

私が前の答えに同意する間、あなたが実際に尋ねた質問に答えるために、頭に浮かぶのはwp-config.phpのためにこれらの定数の一つを使うことです:

 define( 'AUTH_KEY'、 'redacted'); 
 define( 'SECURE_AUTH_KEY'、 'redacted'); 
 define( 'LOGGED_IN_KEY'、 'redacted'); 
 define( 'NONCE_KEY'、 '編集済み'); 

それらはWordpressのインストール間でユニークであることを意味します - そしてWordpressで見つかるべき既存のキーのための唯一の選択肢についてです。別の方法として、管理者の電子メールアドレスまたはその類似物に対してそれらの1つをハッシュし、それを隠し設定オプションに格納することによって構築された独自の同様の定数を追加します。プラグインがインストールされました。最初のインストールで一意にならなかったとしても、管理者/サイトの所有者が事後に失敗を修正することにした場合、彼らは誤ってあなたのパスワード暗号化を破ってはいけません。

暗号化/復号化機能に関しては - Googleのクイック検索は請求書に合うように思われるコードで以下のリストを返します: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-強力暗号化復号化php関数/

関数encrypt($ input_string、$ key){
 $ iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256、MCRYPT_MODE_ECB); 
 $ iv = mcrypt_create_iv($ iv_size、MCRYPT_R) ] $ h_key = hash( 'sha256'、$ key、TRUE); 
 base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256、$ h_key、$ input_string、MCRYPT_MODE_ECB、$ iv))を返す; 
 ] 
関数decrypt($ encrypted_input_string、$ key){
 $ iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256、MCRYPT_MODE_ECB); 
 $ iv = mcrypt_create_iv($ iv。PT_SRAND、MCRYPT_CRT_CR) ] $ h_key = hash( 'sha256'、$ key、TRUE); 
トリムを返す(mcrypt_decrypt(MCRYPT_RIJNDAEL_256、$ h_key、base64_decode($ encrypted_input_string)、MCRYPT_MODE_ECB、$ iv)); 
} 

ここで使用されているAES暗号化のいくつかのドキュメントはここにあります: http://www.chilkatsoft.com/p/php_aes.asp

4
marfarma

これは、OAuthが設計された状況です。

OAuthホームページ から:

サービスプロバイダー開発者向け...

サポートしている場合...

  • webアプリケーション
  • サーバーサイドAPI
  • マッシュアップ

ユーザーに代わって保護されたデータを保存している場合、ユーザーがWebにアクセスするためにパスワードをWebに広めてはいけません。 OAuthを使用して、ユーザーにアカウントの資格情報を保護しながらデータへのアクセスを許可します。

OAuthの利点は、ユーザーのパスワードを保存する必要がないことです。プラグインを最初にセットアップするときに、アプリケーション(通常はAPIと同じサーバーでホストされ、ページリダイレクト、シックボックス、またはiframeでロードされるページ)を介してユーザー名とパスワードでログインするように求められます。 。

ユーザーがログインすると、サーバー(システム)は、システム(WordPress)がAPIとのインターフェースに使用できる安全なキーを作成します。このキーはユーザーアカウントとサイトに固有です-そして、ユーザーに代わってAPIを使用することをアプリケーションに許可します(WordPressで)毎回認証情報を渡すことなく

この動作の例を確認するには、 Jetpack を確認してください。

プラグインをアクティブにすると、接続されていないという苦情が表示されます。 「接続」するときに、WordPress.comから資格情報を入力し、OAuthとそのAPI間のWordPress相互作用をセットアップします。

ただし、これを行う必要があるのはonceで、WordPress.comのユーザー名/パスワードはneverでローカルWordPressデータベースに保存されています。

4
EAMann

多くのサービスはまだOAuthをサポートしておらず、パスワードをオプションデータベースに保存しているため、すべてのWordpressプラグインで読みやすくなっています(上記の私のコメントを参照)。

これは(まだ)質問に対する本当の答えではありませんが、コメントには長すぎます。この「解決できない」問題に対する「最良の」可能な解決策を思いつくために、私はこれとの議論を刺激したいと思います。

パスワードを暗号化することが可能であると私に考える基本的な考えは次のとおりです。

すべてのユーザーが持っている1つの秘密情報があります:彼らのWordpressのパスワード。秘密の派生形式で暗号化された第三者サービスへの認証情報をそのパスワードで保存し、ユーザーがログインしたときにのみそれらを復号化することが可能です。

このようにして、少なくともWordpressファイルとデータベースのコピーからパスワードを盗むことを不可能にすることは可能であるべきです。ログイン時にすべてのプラグインがプレーンテキストのパスワードを取得できるため、他のプラグインが資格情報を盗む問題を解決することはできません。

暗号化されたバージョンのサードパーティサービスがデータベースに格納されていると仮定すると、 'authenticate' フィルタにフックするか、 wp_authenticate() 関数を上書きすることで、プレーンテキストのユーザーパスワードの塩味のハッシュ( wp_hash_password() を使用)、ユーザーがログアウトするまでハッシュ化されたパスワードを暗号化キーとしてプライベートに保存(キーを削除するには 'wp_logout' フックを使用)データベース内の暗号化された値を復号化するためにサードパーティのパスワードが必要になるたびに使用されます。

私はこの仕事をすることが可能であるべきであると感じている間、しかしながら、いくつかの未解決の問題があります:

  1. 暗号化する方法ユーザーがログアウトして再びログインするまでプレーンテキストのパスワードを保存し、'authenticate'の間に暗号化を行うことができる可能性があります。これが起こるまでの期間を短くするために、ユーザはログインを促される可能性があります。
  2. ログアウト中にキーを保存する場所と削除する方法ユーザーが実際にログインしたときにのみ'authenticate'が実行されることを正しく理解していますか?
  3. ハッシュされたパスワードを保存する方法がある場合は、代わりにセッションCookieからキーを派生させることができますか?
  4. 誰がパスワード変更を処理しますか? キャッチ そのようなパスワードの変更は可能であるように見えます、そしてその時、第三者パスワードは新しいパスワードから得られたキーで再暗号化されなければならないでしょう。
  5. マルチユーザーサポートを提供する方法はありますか?理想的には、管理者ユーザーがサードパーティのパスワードを設定することができるようにし、それを特権の低いユーザーがサードパーティのサービスと対話するために使用できるようにすることができます。そのためには、管理ユーザーは、他のユーザーが自分でしか生成できないように、すべてのユーザー用の鍵を生成できる必要があります。それはどういうわけか可能ですか?
0
cgogolin