質問: PHPを使ったログインフォームを想定 ------------------ 以前のエンジニアがパスワードを平文で登録する仕様にしてしまっている物を改修したいと考えているのですが、 既にユーザーがいる状態でどの様に変更をすればスムーズに移行できるのかがわからず悩んでおります。 ユーザーには一切変更をさせずに、今ある`login_passwd`カラムのデータを暗号化できれば理想的で、 運用しながらはさすがに難しいのではと考えているのですが、可能なのでしょうか? ユーザーテーブルのスキーマは以下の通りです。 ``` CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` text, `login_id` text, `login_passwd` text, `active_flag` tinyint(1) NOT NULL DEFAULT '1', `reg_date` datetime DEFAULT NULL, `upd_date` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` php, mysqlのバージョン ---------------- ``` PHP 5.6.30 mysqld Ver 5.7.17 for Linux on x86_64 (MySQL Community Server (GPL)) ```
回答: 1.暗号化したパスワードで認証 レコードがあれば認証完了(成功) レコードがない場合2へ 2.平文のパスワードで認証 レコードがない場合、認証完了(失敗) レコードがあれば3へ 3.平文のパスワードを暗号化し、レコードをUpdateし、認証完了(成功) こうすれば、ログインする度に平文だったユーザーが暗号化されていきます。 利点としては、サービスをとめることなく、アクティブなユーザから暗号化していくことが可能な点。 欠点としては、平文と暗号文のパスワードが同一カラムに混在してしまう点 が、個人的には一度サービスを止めて、全てのパスワードを暗号化して再稼働させるのが良いと思います。 勿論、それに合わせて新規アカウント発行時には同じアルゴリズムで暗号化する処理じ実装する必要がありますが。