by brewbooks
概要
みなさんこんにちはcandleです。最近はphpでサービスを書いたりしています。その中でテストユーザーのアカウント管理でパスワードを暗号化してデータベースに収めています。
ちょっと前までは、php側のsha1でパスワードを暗号化して収めていたのですが、わざわざ、プログラムを書くのも面倒くさかったので、mysql側でテストユーザーを作成できないかと思い調べてみるとできました。
前提
MAMPかXAMMPなどのローカル開発環境またはPHPとmysqlを動かせる環境が準備されている。
テストユーザーのテーブルを作成する
テストユーザーのテーブルは下のものを使いましょう
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `password` varchar(255) NOT NULL, `age` int(10) NOT NULL, `created` datetime NOT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; INSERT INTO `users` (`id`, `name`, `password`, `age`, `created`, `modified`) VALUES (1, 'alice', '', 10, '2014-02-18 05:29:13', '2014-02-18 00:40:22'), (2, 'bob', '', 12, '2014-02-17 21:11:44', '2014-02-18 00:40:43'), (3, 'tom', '', 15, '2014-02-17 04:37:07', '2014-02-18 00:41:18');
これを適当なmysqlのデータベースにインポートするかsql文として実行し、テーブルを作成します。
私はbtestデータベースに作成しました。
MysqlのSHA1でパスワードを暗号化して保存する
userテーブルには3人のテストユーザがいます。aliceのパスワードを登録しましょう。
下のSQL文で暗号化できます。
UPDATE users SET PASSWORD = SHA1('bababa') WHERE name = "alice";
レコードを見てみましょう。aliceのパスワードが暗号化されて保存されています。
便利ですね。
phpからmysqlのパスワードを照合する
phpのsha1で暗号化したパスワードをもとにmysqlのsha1で暗号化したレコードを照合できるか試してみましょう。
結論から言うと、照合できます。仮にPHPから照合できなければ、おさめられているパスワードはマッチされないので意味をなさない事になります。
MAMPのhtdocsのどこかに適当なフォルダを作ります。
私は毎度の事ながら、alltestフォルダを使います。
その中にsha1test.phpを作ります。
sha1test.phpに次のphpコードを書きましょう。
<?php mysql_connect('localhost','root','root')or die(mysql_error()); mysql_select_db('btest')or die(mysql_error()); mysql_query('SET NAMES UTF'); $search_sql=sprintf("SELECT * FROM users WHERE password='%s'",sha1("bababa")); $search=mysql_query($search_sql)or die(mysql_error()); $search_result=mysql_fetch_assoc($search); print_r($search_result); ?>
ブラウザで実行する
私はの場合はalltestフォルダのsha1test.phpファイルなので下のURLになります。
http://localhost:8888/alltest/sha1test.php
ここでの表示結果にaliceのデータが表示されれば成功です。
表示されました。成功です。このことから、mysqlのsha1で保存したデータとphpのsha1で暗号化したデータは照合できるという事がわかります。
まとめ
この方法を知るまではわざわざphpで暗号化してmysqlのデータベースにおさめていました。そうすると、毎度phpでユーザー作成のプログラムを書かなくてはならなかったのですが、これでだいぶ楽になりました。