Web Artisan Blog - ウェブ アルチザン ブログ

Nucleusに見るパスワードの暗号化の方法

Nucleus (35 items)

2004年10月07日

私がPG・SEと言われる職業に就いてから、もう9年が経ちました。
早いもんです。。
技術力に関しては、広く浅く経験してきたので、
特に威張れる技術もなく、本当にそこらの一般的普通なSEです。

そんなレベルの私ですが、ここでパスワードの暗号化について考えてみました。

<スポンサードリンク>
まず、どんなシステムでも大概、ログインという行為が発生します。
そのために、ログインマスタといったマスタ(DB)を用意して、
そこに、ユーザーIDやパスワードといった項目を作成、
そして、ユーザー登録時はデータの登録(INSERT)、
パスワード変更時などは、データの更新(UPDATE)といった処理を行います。
また、ログイン時のパスワードチェックも、
このマスタのパスワードの値と入力されたパスワードが合っているか?
といった処理で実現するのが、ごくごく一般的な方法です。

■図(1)
TABLE_LOGIN(ログインマスタ)
USERID     PASSWORD
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TEST1     1234
TEST2     5678


そこでこのマスタに、
パスワードをどうデータセットするかという事が問題になります。

最近でこそ、セキュリティ・ポリシーや何やらで、
あらゆる面でうるさくなり、データの暗号化というのも考えられてますが、
以前は、考えられているようで考えられていないのが実情であったと思います。
(システムなんて、大規模だからしっかりしているといったものではないですからね。。)

これはログインマスタについても同じで、
このマスタに登録されている各データのパスワードが、
図(1)のように、平文(入力されたそのものの値)のままであるシステム、
これはセキュリティをあまり考慮していないシステムと言っていいでしょう。
(こういうの、未だに結構あると思いますが。。。)

つまり、パスワードが何らかの形で、
人間が目で見てそれとわかる状態であるのは好ましくないのです。
まあ、基本的にとあるシステムのDBを、見ず知らずの人が見ることはない、
というか、そこはまずネットワークのセキュリティを強化する、
DBのセキュリティ設定を強化するとかでいい訳なんですが、
もっと言うと、そのシステムに携わっている人間、
そのログイン処理を作った人間でも、他人のパスワードが見れることは厳密にはよくありません。

ここでパスワードの暗号化を使うという方法があります。
これをNucleusの各ユーザー情報を持っている、
”nucleus_member”テーブルを例にとって考えます。

まず、nucleus_memberテーブルはmnameにユーザーID、
mpasswordにパスワードを持っています。
※nucleus_memberテーブルには、これら以外の項目もありますが今回は抜粋
ここに平文でデータ登録されている場合、データは下記のようになります。

■図(2)
nucleus_member
mname     mpassword
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TEST1     1234
TEST2     5678


しかし、実際には暗号化されているので、下記のようになっています。

■図(3)
nucleus_member
mname     mpassword
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TEST1     kjg0142343c2aplcsddfas9f3iuee23
TEST2     ofs980980gdadascsdjhe20987fd89f


つまり、
”1234”は”kjg0142343c2aplcsddfas9f3iuee23”に、
”5678”は”ofs980980gdadascsdjhe20987fd89f”に、
暗号化(人が見ても理解できない文字列に変換)されているのです。

Nucleusでは、この暗号化にPHPのmd5関数を使用しています。
ユーザー登録時のnucleus_memberにINSERTする際、
入力された”1234”のようなパスワードを、
md5関数で暗号化しmpasswordに登録しているのです。
md5('1234')

またパスワードチェックする際も、
画面入力されたパスワードをmd5関数で暗号化し、その文字列と、
nucleus_memberに格納されている暗号化したパスワードとを比較しています
(md5での暗号化では同じ文字列を暗号化すれば常に同じ暗号化された文字列になります)

つまり、Nucleusに関わるDB、またプログラムである各PHP内のどこにも、
”1234”といった値は存在しません。
よって、パスワードを知っているのは、ユーザー本人のみです。

暗号化された値、
それを逆に変換して”1234”といった値にできないかというのがありますが、
基本的にこれはできません。
(md5の暗号化アルゴリズムを知っている人間でない限り、できません)

またパスワードを忘れた場合、
Nucleusでは、管理画面のログイン画面に「パスワードを忘れた場合 」リンクがあり、
ここで、ユーザーIDとメールアドレスを入力しますが、
この機能は、忘れたパスワードを教えてくれるのではなく、
Nucleusが新たにランダムな文字列でパスワードを発行してくれるものです。
このパスワードは、ユーザーにメールで通知され、
そのパスワードでログインすることができます。
さらに、ランダムなパスワードでは覚えにくいのであれば、一度ログインした後、
パスワードを自分で考えたパスワードにも変更できます。
つまり、”1234”という忘れてしまったパスワードは、
誰に知られる訳でもなく、無事、他のパスワードに変更されるのです。
もちろん、このランダムに作成されたパスワードも暗号化されています。


・・おおっと、こうなると机の上でメモ書きしたパスワードも問題になってきます。
パスワードは頭の中だけにあるものとなるのです。。


このように、Nucleusはパスワードに関しても暗号化されているので、
そこらのしょうもないシステムに比べても、セキュリティは強化されています。

しかし、突き詰めていくと、
「パスワード変更する際のメールを他の人間が見ることができたら同じやん」
ってな事にもなってきます。。

もっと言うと、PHPのmd5関数も問題あるようです。。。

暗号アルゴリズムに重大な欠陥発見の報告相次ぐ
MD5やSHA-0、SHA-1といったアルゴリズムは、コンピュータ科学者の間ではハッシュ関数として知られているもので、これらは電子メールのメッセージからオペレーティングシステムのカーネルまであらゆる種類の入力信号を受け取り、ユニークなハッシュ値を生成する。この入力信号の文字列を1つでも変えると、それだけで全く別のハッシュ値が出力される。

各種のセキュリティアプリケーションは、ユニークなハッシュ値が生成されるという特性を持つこれらのアルゴリズムを利用している。だが、悪質な攻撃者が、別の入力信号からまったく同じハッシュ値を作れてしまうとなると、ねつ造されたハッシュ値(ハッシュ衝突)を悪用できるようになってしまう。そうすると、悪質なソフトウェアを安全なものに見せかけることが可能になり、ユーザーが誤ってこれをダウンロードして実行してしまうこになりかねない。また、電子署名をねつ造して他人になりすまし、他人の銀行口座を空にしてしまうことも考えられる。



・・・、ではどうすれば??

どうするもこうするも、最終的にはこの記事のこの一文に尽きると思います。

研究者の間では、100%安全といえる暗号アルゴリズムなど存在し得ないという考え方が常識となっている



所詮、人間が作るものに完璧なものなどありません。。。。。

<スポンサードリンク>
前の記事 次の記事

Comments

コメントは、まだ書かれていません

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=292