EC-CUBE 2系から4系へ移行するとき、会員のパスワードは条件を満たせばそのまま引き継げます。判定の基準は「2系のパスワードが40文字のSHA1で保存されているか」と「旧サイトの AUTH_MAGIC を取得できるか」の2点です。この2つが揃っていれば、4系の ECCUBE_AUTH_MAGIC に同じ値を設定するだけで、会員は従来のパスワードでログインできます。
移行前に確認する2点
まず旧サイトのDBで、パスワードの保存形式を確認します。
SELECT customer_id, password, LENGTH(password) FROM dtb_customer
WHERE del_flg = 0 AND password IS NOT NULL LIMIT 3;
値が40文字の16進数であればSHA1です。あわせて salt カラムの有無も見ておきます。2.11より前のバージョンにはこのカラムがなく、その場合が引き継ぎの対象になります。
次に旧サイトの AUTH_MAGIC を調べます。定数として定義されているので、キャッシュされた定数ファイルか設定ファイルから取得できます。
grep -r "AUTH_MAGIC" data/cache/mtb_constants.php
なぜ引き継げるのか
2系はパスワードを次の式で保存しています。
return sha1($password . ":" . AUTH_MAGIC);
この関数には「ここに統一すれば移行するときに楽」というコメントが添えられています。将来の移行を見越した実装です。
そして4系の PasswordHasher::verify() には、この形式を受け付ける分岐が今も残っています。
// 旧バージョン(2.11未満)からの移行を考慮
if (empty($salt)) {
$hash = sha1($plainPassword.':'.$this->auth_magic);
} else {
$hash = $this->hash($plainPassword, $salt);
}
salt が空の場合だけ、2系と同じ式で照合します。4系の通常のパスワードは hash_hmac で生成されるので、salt の有無で新旧を判別している形です。
さらに security.yaml で migrate_from が設定されており、旧形式でログインが成功すると新形式へ自動的に再ハッシュされます。会員が一度ログインすれば、以降は4系の形式で保存されます。
Eccube\Entity\Customer:
algorithm: 'auto'
migrate_from:
- legacy
設定するのは AUTH_MAGIC だけ
データ移行時は dtb_customer の password をそのままコピーし、salt は空のままにします。あとは4系の .env に旧サイトと同じ値を書きます。
ECCUBE_AUTH_MAGIC=<旧サイトのAUTH_MAGICの値>
この値を変えると、移行した会員全員がログインできなくなります。新規構築なら任意の文字列で構いませんが、2系からの移行では旧サイトの値を使う必要があります。移行後に変更することもできません。
引き継げないケース
2.11以降の2系で salt カラムに値が入っている場合は、4系の hash_hmac とアルゴリズムが一致するかを個別に確認する必要があります。4系の既定値は eccube.yaml の eccube_password_hash_algos で SHA256 が指定されているので、旧サイトの設定と一致するかを確認してください。
また、旧サイトの AUTH_MAGIC が取得できない場合も引き継げません。この場合は会員にパスワード再設定を案内することになるため、移行の見積もりを出す前に確認しておくべき項目です。会員数が多いサイトでは、この案内の手間そのものが移行のコストになります。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。