以前もここに書いたことがあるが、うちで運営している某地域 SNS(OpenPNE のカスタマイズで構築)のサーバの引っ越しをしたいのだが、新しいサーバで何故かログインが出来ないため引っ越し中断・・・という状況が発生していた。
原因はわかっていて、ログインIDであるメールアドレスが可逆暗号化され DB に格納されているのだが、その可逆暗号化の結果が新旧のサーバで異なるためである。
OpenPNE は Blowfish.php というライブラリを使用して可逆暗号化を行うが、具体的には、以下のように何らかの環境の違いで、暗号化された結果の値がサーバにより異なってしまうのだ。(俺が OpenPNE のプログラムを元に作った encode/decode プログラムで試してみた)
(例)
旧サーバで、アドレス hoge@exsample.jp を可逆暗号化。
% ./address_encode.php hoge@exsample.jp
KAE+4mgyUhML7DfiOOerPA==得られた結果を、同じ旧サーバで復号してみる。
% ./address_decode.php KAE+4mgyUhML7DfiOOerPA==
hoge@exsample.jpバッチリ復号できる!
で、この暗号化されたコードを、新サーバで同じように復号してみる。
% ./address_decode.php KAE+4mgyUhML7DfiOOerPA==
*エ喀:t.^+7僖甍ヌうぎゃあ。化け化けになって駄目じゃん。
ちなみに、同じアドレスを新サーバで可逆暗号化すると、まったく違う結果になる。
% ./address_encode.php hoge@exsample.jp
3ATgPj5OoPcpqogJG2uGhg==で、もちろんこれは復号出来る。
% ./address_decode.php 3ATgPj5OoPcpqogJG2uGhg==
hoge@exsample.jp
・・・ということだ。
なので、旧サーバの DB の内容を単純にバックアップ&リカバリしただけでは SNS にログイン出来ないのである。
結局、旧サーバで一旦 c_member_secure テーブルの内容を復号してファイルに保存。
新サーバで DB をそのままリカバリした後、このファイルをもとに改めて可逆暗号化を行い、c_member_secure テーブルを UPDATE するという移行ツールを作って対応。
これで、PC からのログインも、携帯からのログイン(簡単ログイン含む)もばっちりOK!となった。
いやあ、しかし、何でこんな事が起きるんかねえ。
OS の違いは関係ないんだろうけど。(旧サーバは FreeBSD 6.0-RELEASE、新サーバは CentOS release 5.4)
PHP(PEAR 含む)のバージョンが全然違うので、そのせいかねえ。
こういう現象が世の中で沢山起きていれば商売になるのだがなあ・・・(^^;
コメントする