TOP > スクリプト制作メモ > 暗号化処理(crypt)について

≫暗号化

暗号化とは、元の文字列をなんらかの法則で別の文字列に変換することにより元の文字列をわからなくすることを言います。

例えば、

DHJ:jt:Xpoefsgvm

これは、ある文字列をすごく単純に暗号化したものです。

元の文字列は、

CGI is Wonderful

です。

スペースをコロンに変換し、英字は、a→b、b→c という風にコードをひとつずらした文字に置き換えています。

CGI is Wonderful
DHJ:jt:Xpoefsgvm


たったこれだけのことでもぱっと見では元の文字列がわからなくなります。単純ですが、これも暗号化の一種です。この場合、コードをいくつずらすかがキーになっています。

しかし、上記のような暗号化は非常に古典的で、現在は子どもだましくらいにしか使われません。

≫crypt関数

パスワードを使用したCGIを作成する場合など、パスワードの漏洩を防ぐために暗号化処理が必要になります。

Perl では、暗号化用に関数 crypt があります。

 $crypt_pswd = crypt($pswd,$salt);

$pswd を $salt キーによって暗号化した文字列が $crypt_pswd に戻ります。

$pswd は通常、先頭の8文字(バイト)が有効です。$salt は先頭の2文字(バイト)が有効です。ただし、わざわざ文字列を切り出して渡す必要はありません。crypt に渡した時点で無効部分は切り捨てられます。

$salt にはピリオド(.)、スラッシュ(/)、半角英数字(英字は大文字小文字の区別あり)が使えます。$salt に無効な文字列が渡されると、crypt 関数は自動的にピリオド(.)を SALT とするそうです。また、$salt が省略されると AA が当てられるそうです。

crypt 関数は、一方通行の暗号化を行います。元に戻す関数 decrypt のようなものはありません。暗号を破るには総当りという手になります。

≫crypt関数の問題点

crypt関数には重大な問題点があります。
それは、暗号化形式がマシンに依存しており、当然、暗号化形式の異なるマシン上では暗号化の結果が異なり、認証もうまくいきません。

暗号化形式はおおきく以下の2つです。
  • DES方式
  • MD5方式
DES方式は暗号化と複合化に同じキーを用います。キーは2文字で、それ以上の長さのキーを与えても先頭2文字以外は無視されます。また、パスワード(平文)も8文字以上は無視されます。パスワードの符号は13文字です。

対してMD5方式は複合化に相当する計算方法が存在せず、キーもありません。パスワード(平文)は8文字以上の長さに対応しており、パスワードとして使える符合も24文字あります。また、暗号化したものの先頭が必ず $1$ ではじまります。

強度の話をすると、単純に言えば、DESよりもMD5の方が長い分パスワードとしての強度があります。しかし、56bitという暗号鍵は総当りできる範囲内です。絶対の強度はおけず、一般的にもDESやMD5は単純な暗号化にしか利用されません。

とは言うものの、個人ホームページなどのCGIで使用するパスワード程度には充分便利に利用することができます。


TOP > スクリプト制作メモ > 暗号化処理(crypt)について
(C) bayashi.net