Entries
PHPではcryptという関数によって文字列を暗号化することができます。
※ この関数で暗号化された文字列は複合化する(元に戻す)ことはほぼできないので、復号を要するような用途には使えません。
何に利用するのかというと、認証に利用します。
簡単なパスワード認証機能はおそらくこれを利用しています。
文字列Aをcrypt関数で暗号化した文字列Bの間で次のことが言えます。
・AはBとは違う。
・BはAに戻すことはほぼ不可能。(注1)
認証を利用する場合を考えます。
例えば、掲示板では投稿に対してそれぞれの投稿に編集パスが与えられます。そのパスは名前などの情報と共にログファイルに保存されます。が、ログファイル自体は見つければ誰でも閲覧することが出来ます。そこに編集パスがそのままの状態であれば、これは当然ばれてしまいます。
こういうときに、編集パスを投稿に際してcryptで暗号化します。すると、もしログファイルを第三者に閲覧されても、暗号化されていてさらに複合化もほぼ不可能であるから、第三者には元の編集パスが分からないのです。唯一分かる投稿者が編集時に元の編集パスを送信して、それを暗号化したときにログファイルにある暗号と一致すれば、認証されたことになるのです。
ここではDES暗号を用います。(cryptの使い方でDESやMD5の2種類の暗号化が利用できます。)
string crypt ( string str, string [salt])
strは暗号化する文字列(8文字以上は同じになるので8文字まで。)
saltは暗号化するための2文字の文字列です。これはプログラム内に指定します。
saltによって返り値は変化します。また、返り値の最初の2文字にsaltが含まれ、その後の11文字が暗号化文字列になります。
ここで今、$_POST["pass"]にパスワードが格納されていて、それを保存する前とします。
$Salt="ab";
$Crypt=crypt($_POST["pass"],$Salt);
$Crypt=substr($Crypt,2); //返り値に含まれるsaltを取り除く(注2)
送信された編集パス$_POST["pass"]が暗号化されたパス$Cryptedと一致するかどうかを検証します。
$Salt="ab";
$Crypt=crypt($_POST["pass"],$Salt);
$Crypt=substr($Crypt,2);
if($Crypt==$Crypted)echo "認証しました。";
else echo "認証できません。";
プログラム自体は単純ですね。
注1…暗号化された文字列は、多くの台数のコンピュータを用意すれば解読することができるらしいです。まあそこまでして解読して掲示板の管理室に侵入するような荒らしはいませんでしょうけど・・・。
注2…Saltをつけた状態では、総当り(全ての文字列について探って見つけること)や予想当り(パスと予想される文字列について探って見つけること)に対して、ある文字列が本当のパスであるかを検証するのが少しながら容易になってしまいます。要するにsaltがあれば自分だけで検証できて、無ければ暗号を生成したプログラム自体を通す必要があるのです。
※ この関数で暗号化された文字列は複合化する(元に戻す)ことはほぼできないので、復号を要するような用途には使えません。
何に利用するのかというと、認証に利用します。
簡単なパスワード認証機能はおそらくこれを利用しています。
文字列Aをcrypt関数で暗号化した文字列Bの間で次のことが言えます。
・AはBとは違う。
・BはAに戻すことはほぼ不可能。(注1)
認証を利用する場合を考えます。
例えば、掲示板では投稿に対してそれぞれの投稿に編集パスが与えられます。そのパスは名前などの情報と共にログファイルに保存されます。が、ログファイル自体は見つければ誰でも閲覧することが出来ます。そこに編集パスがそのままの状態であれば、これは当然ばれてしまいます。
こういうときに、編集パスを投稿に際してcryptで暗号化します。すると、もしログファイルを第三者に閲覧されても、暗号化されていてさらに複合化もほぼ不可能であるから、第三者には元の編集パスが分からないのです。唯一分かる投稿者が編集時に元の編集パスを送信して、それを暗号化したときにログファイルにある暗号と一致すれば、認証されたことになるのです。
ここではDES暗号を用います。(cryptの使い方でDESやMD5の2種類の暗号化が利用できます。)
string crypt ( string str, string [salt])
strは暗号化する文字列(8文字以上は同じになるので8文字まで。)
saltは暗号化するための2文字の文字列です。これはプログラム内に指定します。
saltによって返り値は変化します。また、返り値の最初の2文字にsaltが含まれ、その後の11文字が暗号化文字列になります。
ここで今、$_POST["pass"]にパスワードが格納されていて、それを保存する前とします。
$Salt="ab";
$Crypt=crypt($_POST["pass"],$Salt);
$Crypt=substr($Crypt,2); //返り値に含まれるsaltを取り除く(注2)
送信された編集パス$_POST["pass"]が暗号化されたパス$Cryptedと一致するかどうかを検証します。
$Salt="ab";
$Crypt=crypt($_POST["pass"],$Salt);
$Crypt=substr($Crypt,2);
if($Crypt==$Crypted)echo "認証しました。";
else echo "認証できません。";
プログラム自体は単純ですね。
注1…暗号化された文字列は、多くの台数のコンピュータを用意すれば解読することができるらしいです。まあそこまでして解読して掲示板の管理室に侵入するような荒らしはいませんでしょうけど・・・。
注2…Saltをつけた状態では、総当り(全ての文字列について探って見つけること)や予想当り(パスと予想される文字列について探って見つけること)に対して、ある文字列が本当のパスであるかを検証するのが少しながら容易になってしまいます。要するにsaltがあれば自分だけで検証できて、無ければ暗号を生成したプログラム自体を通す必要があるのです。
0件のコメント
コメントの投稿
0件のトラックバック
- トラックバックURL
- http://noraphp.blog73.fc2.com/tb.php/13-75d1d981
- この記事に対してトラックバックを送信する(FC2ブログユーザー)


