アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは、趣味で PHP を触っています。
とても初歩的な質問になってしまうと思いますが、よろしくお願いします。

PHP では crypt 関数で暗号化することができるらしいのですが、実際にこれを使わなければいけない場合とはどのような時なのでしょうか?
http://jp2.php.net/manual/ja/function.crypt.php

PHP で処理したことを MySQL などのデータベースに書き込む場合、主にサーバー内での処理なので外部から見られることなんてないと思っていましたが、見ることは可能なのでしょうか?

それともう一つ質問がありまして、マニュアルには「復号するための関数はありません。 crypt() が使用しているのは単方向アルゴリズムだからです。」とありますが、それだと暗号化すると二度とその情報が何かわからなくなるのではないでしょうか?
何か複合化する方法があるのですか?

よろしくお願いします。

A 回答 (4件)

LinuxなどのUnix系OSは、ディレクトリや操作の行える権限を付加したユーザを作成することが出来ます。


これは例えばレンタルサーバに登録してFTPなどでアクセスした場合に、自分自身のアカウントのみ
アクセスすることが出来るのは、登録したユーザに操作やアクセス権限を付加したからです。

では、そのユーザIDとパスワードの管理はどのように行っているかというと、
パスワード管理用のテキストファイルを作成し管理しています。

ではこのファイルを何らかの方法(サーバの脆弱性をついたりとか)で、
例えばPHPアプリケーションから開けてしまったとした場合、
全部のユーザのIDとパスワードが見えてしまうわけですが、このファイルは、Unixの標準的な
crypt関数にてパスワードを暗号化してファイルに保存されています。
このように管理すれば万が一パスワードを保存しているファイルを参照されてしまっても、
パスワードが復元不可能な形式で保存されておりますので、すぐにパスワードを利用して
FTPなどでアクセスする、ということが出来なくなります。

PHPのcrypt関数の由来は恐らく上記のものと思います。
ではcrypt関数は具体的にどのようなものかといいますと
<?php

echo crypt('aaaaa', 'hoge');

?>
とした場合、echoされる文字列は「ho9xbp3QsjfW6」となります。
第一引数の文字列と第二引数のsaltが同じであれば返る値も必ず同じになります。

これを利用して、
---password.txt------
{暗号化されたパスワード文字列}

---main.php----------
<?php

$password = $_POST['password']; //フォームなどで送信されてきたパスワード
$check_pass = file_get_contents('password.txt'); //正しいパスワードが保存してあるファイルを開き値を取得

if($check_pass == crypt($password, 'hoge')){
echo "OK";
}else{
echo "NG";
}

?>
としてやれば、ユーザが送信したパスワードを(saltをhogeとした)crypt関数にて、暗号化したものと
暗号化して保存してあるパスワードを称号して、同一だったらログインさせる、といったことが
可能となります。

最近では、crypt関数は、暗号強度が弱いということでmd5関数にて、暗号化(ハッシュ化)することが
一般的のようです。
mysqlに格納するパスワードを不可逆暗号化をするのは回答の最初に述べた理由と同じ由来なのだと思います。
(mysqlもユーザID/パスワードを割り振ってアクセスするデータベースの権限とかを発行できる為)


とりあえずは、数あるセキュリティや個人情報保護の方法のうちの一つで、一般的な作法であると
認識していればいいのかなぁと思います。
    • good
    • 0
この回答へのお礼

皆さん!大変ためになるアドバイス本当にありがとうございます!
かなり忙しくて返事できずにいましたが、しっかりと読ませていただきました!!

さっそくいろいろ試したいと思います。
本当に勉強になりました!

ものすごく感謝しています!

またよろしくお願いします!!

お礼日時:2009/07/08 01:05

ただのcrypt関数は元のデータが一切分からなくなりますよ。


じゃあ、どこで使用するかといいますと、

よく使うのは掲示板書き込みやコミュニティーサイトのパスワード
例え管理者でもログインパスワードが何らかの手段を用いれば見られるのは好ましくありません。
(IDとパスワードは複数のサイトで同じ物を使ってるとか、よくあるからね)
使い方は
保存するパスワードをcryptで暗号化し、ログインする時に同じcryptで暗号化し、同じ文字列が出てきたら、その暗号化する前のワードも同じと判断します。

後は使用者のID
主には多重ログインやなりすまし対策ですね。
2ch等でIDという物がありますが、あれはIPアドレスなどをcryptで暗号化していたりします。
これを行う事によって、利用者から自作自演が分かったりするのです。
    • good
    • 0

ANo.1です。



回答しきれていない部分がありました。
単方向アルゴリズムについての解釈は合っています。
私が書いた例でいえば、可逆なアルゴリズムであるよりも不可逆な方がセキュリティ面で効果が高いということになります。
いくら暗号化しても複合化する手段があれば元のデータを見ることができるわけですから。
    • good
    • 0

よく使われるケースとしては、パスワードを暗号化してデータベースに格納するというのがありますね。


生のパスワードを保存しないことで漏えいなどに対するセキュリティを高める効果があるものと思います。
私なら同様のことをする場合はもっぱらmd5関数を使いますが。
http://jp2.php.net/manual/ja/function.md5.php

ちなみに、crypt関数のマニュアル中に載っている、拡張モジュールであるmcryptを使えば複合可能な暗号化を行うことができます。
http://jp2.php.net/manual/ja/ref.mcrypt.php
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!