バージョン選択

フォーラム

メニュー

オンライン状況

55 人のユーザが現在オンラインです。 (51 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 55
もっと...

サイト内検索

質問 > 管理機能 > 会員パスワード生成ロジックを作成したい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2017/8/3 12:04
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
会員パスワード生成ロジックを作成したい
EC-CUBE3.0.14

別システムからの顧客データの移行で、パスワードの作成に行き詰まっています。
移行元ではパスワードは平文で扱っていました。

EC-CUBE3の会員情報更新時のパスワード生成ロジックを抜粋してパスワード作成プラグラムを作成しようとしています。

Saltの発行ロジックは次から抜粋しました。
src/Eccube/Controller/Admin/Customer/CustomerEditController.php
src/Eccube/Repository/CustomerRepository.php
vendor/symfony/security/Core/Util/SecureRandom.php

問題は、SecureRandom.php で呼んでいる関数 random_bytes() がどこに定義されているかがわからないことです。
ソース内をgrep検索したところ6件の関数定義が見つかりましたがどれが呼ばれているかわかりません。

どなたかわかりますでしょうか?

以下、作成途中のパスワード作成プラグラムです。

<?php

//step1 ここを環境に合わせて書き換える (app/config/eccube/config.yml内の値を記入)
define("AUTH_MAGIC","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
define('PASSWORD_HASH_ALGOS', 'sha256');

//step2 元の平文パスワードを1行毎追記する
$parr = array(
    'password',
    '123456',
);

echo '<table border="1"><tr><td>平文パスワード</td><td>暗号化パスワード</td><td>salt</td></tr>';
foreach($parr as $k=>$v){
    $salt = createSalt(5);
    echo '<tr><td>' . $v . '</td><td>' . encryptPassword($app, $Customer) . '</td><td>' . $salt . '</td></tr>' ;
}
echo '</table>';



// 以下、EC-CUBE3.0.14のソースより抜粋

/**
 * saltを生成する
 *
 * @param $byte
 * @return string
 */
function createSalt($byte)
{
    return bin2hex(random_bytes($byte));
}

/**
 * 入力されたパスワードをSaltと暗号化する
 *
 * @param $app
 * @param  Customer $Customer
 * @return mixed
 */
function encryptPassword($app, \Eccube\Entity\Customer $Customer)
{
    $encoder = $app['security.encoder_factory']->getEncoder($Customer);

    return $encoder->encodePassword($Customer->getPassword(), $Customer->getSalt());
}

/**
 * Encodes the raw password.
 *
 * @param string $raw  The password to encode
 * @param string $salt The salt
 *
 * @return string The encoded password
 */
function encodePassword($raw, $salt)
{
    if ($salt == '') {
        $salt = 'AUTH_MAGIC';
    }
    $res = hash_hmac(PASSWORD_HASH_ALGOS, $raw . ':' . AUTH_MAGIC, $salt);

    return $res;
}


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

nyorai
投稿日時: 2017/8/3 14:16
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 会員パスワード生成ロジックを作成したい
random_bytesはphpの標準関数ですね。
http://php.net/manual/ja/function.random-bytes.php

これはphp7から追加された関数です。php7で実行する場合は特に意識する必要はないです。

grepで引っかかるのは、たぶんparagonie/random_compatで提供されてるものかなと思います。
これは新しく追加された関数をphpの下位バージョンでも使えるようにしてくれるライブラリです。
実行する環境に応じて適切な関数呼び出しをしてくれます。

https://github.com/paragonie/random_compat

なのでrandom_byteは特に気にしなくてもよいのかなと思います。
h_tanaka
投稿日時: 2017/8/3 14:38
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 会員パスワード生成ロジックを作成したい
nyorai さん、
まさにおっしゃるとおりです。

ただ、PHPのバージョンを7で試してみると HTTP ERROR 500 が発生してしまいます。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

h_tanaka
投稿日時: 2017/8/3 14:40
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 会員パスワード生成ロジックを作成したい
php5 で実行したときに問題になっているのは、random_bytes($byte) がうまく実行できていないことです。
echo random_bytes($byte);
としても画面上に何も表示されません。
try catch しても例外は発生していませんでした。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

nyorai
投稿日時: 2017/8/3 14:44
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 会員パスワード生成ロジックを作成したい
どんなエラーが発生しているかわかりますか?

あと、ec-cubeとは関係のない箇所に配置して、このスクリプトを単独で動かしている感じでしょうか?
h_tanaka
投稿日時: 2017/8/3 14:50
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 会員パスワード生成ロジックを作成したい
いいえ、どんなエラーが発生しているかはわかりません。

はい、EC-CUBEと別のディレクトリにプログラムを配置して動かしています。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

nyorai
投稿日時: 2017/8/3 15:33
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 会員パスワード生成ロジックを作成したい
ありがとうございます。

php5は、paragonie/random_compatをインストールしてrequireしないと動かないです。

https://github.com/paragonie/random_compat/releases
から、Version 2.0.10のSource Code(Zip)をダウンロードして展開する。


<?php
require './random_compat-2.0.10/lib/random.php';

ini_set('display_errors', 'On');
error_reporting(E_ALL);

echo random_bytes(10);


で一度試してもらえませんか。
h_tanaka
投稿日時: 2017/8/3 15:58
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 会員パスワード生成ロジックを作成したい
nyorai さん
ありがとうございます!

ご提示のとおりに paragonie/random_compat をrequireしたらうまく動きました!

ただ、暗号化が正しく行われているかを確認するために、既存の会員情報レコードの salt を $salt に代入して実行したところ、DBに保存されている password とは異なるパスワードが生成されてしまいました。
なにかロジックが間違っているのでしょうか...?

<?php

header('Content-Type: text/html; charset=UTF-8');
ini_set('display_errors', 'On');
error_reporting(E_ALL);

//step1 ここを環境に合わせて書き換える (app/config/eccube/config.yml内の値を記入)
define("AUTH_MAGIC","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
define('PASSWORD_HASH_ALGOS', 'sha256');

//step2 元の平文パスワードを1行毎追記する
$parr = array(
    'password',
    '123456',
);

echo '<table border="1"><tr><td>平文パスワード</td><td>暗号化パスワード</td><td>salt</td></tr>';
foreach($parr as $k=>$v){
    $salt = createSalt(5);
    echo '<tr><td>' . $v . '</td><td>' . encodePassword($v, $salt) . '</td><td>' . $salt . '</td></tr>' ;
}
echo '</table>';



// 以下、EC-CUBE3.0.14のソースより抜粋

/**
 * saltを生成する
 *
 * @param $byte
 * @return string
 */
function createSalt($byte)
{
    require './random_compat-2.0.10/lib/random.php';

    return bin2hex(random_bytes($byte));
}

/**
 * Encodes the raw password.
 *
 * @param string $raw  The password to encode
 * @param string $salt The salt
 *
 * @return string The encoded password
 */
function encodePassword($raw, $salt)
{
    if ($salt == '') {
        $salt = 'AUTH_MAGIC';
    }
    $res = hash_hmac(PASSWORD_HASH_ALGOS, $raw . ':' . AUTH_MAGIC, $salt);

    return $res;
}


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

nyorai
投稿日時: 2017/8/4 11:02
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 会員パスワード生成ロジックを作成したい
手元の環境では同じものが生成できているようにみえます。

以下の手順で試しました。

- EC-CUBE環境で、パスワードは「password」で会員登録を行う
- 登録した会員情報のsalt値を使ってこのスクリプトを実行

AUTH_MAGICが間違ってたり、パスワードを入力間違いしてたりなどはありませんか?
h_tanaka
投稿日時: 2017/8/4 19:04
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 会員パスワード生成ロジックを作成したい
他のデータベースと照らしてみたら合ってました!
最初に参照したデータはパスワードか何か間違ってたのだと思います。

nyorai さん
ありがとうございました!


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,288名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.