web-dev-qa-db-ja.com

WordPressはどこのようにパスワードを暗号化しますか?

可能な重複:
PHPを使用してDBでWordPressが生成したパスワードを検証するにはどうすればいいですか?

私はWordPressで行われているサイトで作業していて、WPの外部にある部分を追加してユーザーのログインを確認する必要がありますが、WPがパスワードを暗号化する方法DBで...

私はMD5で試してみましたが、そうではありません...

誰もがプラグイン/チェッカーを使わずにWPの外でパスワードをチェックする方法を知っていますか?PHPコードをクリアしますか?

7
SharkTheDark

パスワード暗号化ライブラリは/wp-includes/class-phpass.phpにあります。 ポータブルPHPパスワードハッシュフレームワークです

11
John Watson

それはあなたがWPのデータベースに対してユーザー名/パスワードを検証するために外部コードを使用したいようです。それが正しければ、あなたは車輪を再発明するのに多くの時間を費やすことになるでしょう。しかし、単純なPHPを使用してこれを実行する方法の良い例として、既にそれを実行している中心的なWP関数を調べることをお勧めします。

その好例、 `wp_check_password() ':

function wp_check_password($password, $hash, $user_id = '') {
    global $wp_hasher;

    // If the hash is still md5...
    if ( strlen($hash) <= 32 ) {
        $check = ( $hash == md5($password) );
        if ( $check && $user_id ) {
            // Rehash using new hash.
            wp_set_password($password, $user_id);
            $hash = wp_hash_password($password);
        }

        return apply_filters('check_password', $check, $password, $hash, $user_id);
    }

    // If the stored hash is longer than an MD5, presume the
    // new style phpass portable hash.
    if ( empty($wp_hasher) ) {
        require_once ( ABSPATH . 'wp-includes/class-phpass.php');
        // By default, use the portable hash from phpass
        $wp_hasher = new PasswordHash(8, TRUE);
    }

    $check = $wp_hasher->CheckPassword($password, $hash);

    return apply_filters('check_password', $check, $password, $hash, $user_id);
}

まず、WordPressは、ユーザーのハッシュ化されたパスワードがセキュリティのためにまだ旧式のMD5を使用しているかどうかを確認します。これは更新に対する後方互換性を保つためです。パスワードMD5の場合、WordPressは新しいシステムを使用して自動的に新しいハッシュに置き換えます(wp_set_password()の呼び出し)。MD5ではない場合、WPは新しいハッシュ設定に進みます。

最初に、Portable PHP Hashing Framework(別の回答で@John Watsonによって既に言及されています)を含めて、そのインスタンスを作成し、それをグローバル$wp_hasher変数に格納します。

次に、ライブラリのCheckPassword()メソッドを使用して、プレーンテキストのパスワードとハッシュを渡して確認します。

これを外部ライブラリで使用したい場合は、まずライブラリのinclude/requireをインスタンス化し、次にプレーンテキストのパスワードとそのハッシュを渡す必要があります。だから/ 未テスト psuedo-code ...

function validate_password( $plaintext, $hash ) {
    require_once( 'class-phpass.php' );
    $hasher = new PasswordHash(8, TRUE);

    return $hasher->CheckPassword( $plaintext, $hash );
}
2
EAMann
require_once( '/path/to/wp-includes/class-phpass.php' );
$wp_hasher = new PasswordHash( 8, TRUE );
$password = 'swordfish';
$hashed_password = $wp_hasher->HashPassword( $password );
1
Milo