暗号化について調べてみた@PHP技術

セッションハイジャックに関連して調べていくうちに、暗号化形式について気になったので調べてみました。


できればコード上で適切な暗号化形式を選べるようになりたい。

まず、暗号化形式には大まかに2つ形式があって〜公開鍵・秘密鍵の話はわかっている前提で進めます。
PHPで利用可能な暗号化関数は4つあります

SHA = Secure Hash Algorithmの略。
後述のMD5より強固でSSHとかIPSecなどに使われている。MD5に替わる暗号化方式。
SHAにはいろいろなバージョンがあるが、それはまたの機会に。

関数仕様は
sha1($String [TRUE | FALSE])

この関数を利用すると文字列を40文字のハッシュとして返す

例)
sha1('abcde')
↓
03de6c570bfe24bfc328ccd7ca46b76eadaf4334

ちなみに、第2引数にTRUEを指定すると20バイトのバイナリで吐き出します
↓吐き出してみた

  • md5()関数(MD5ハッシュ)

出力は先のSHAと同じく、ハッシュを出力する関数。ただし、先のSHAト比べてバイト数が短い。
SHA->40バイトに対してMD5は32バイト←誤表記です。
正:SHA->40文字に対してMD5は32文字
関数の利用方法はSHAと同じ。

例)
md5('abcde')
↓
ab56b4d92b40713acc5af89985d4b786

第2引数にTRUEを与えることでバイナリ形式でも吐き出します

  • crypt()関数(DES暗号化)

DES暗号化で暗号化する時に使う関数

例)
crypt('abcde')
↓
$1$8n/.vs5.$GRoOttZJNyYvlZc2Gg.nw/

ROT13=文字をアルファベット群を半周させる暗号?方式です。

へーこんなのあるんだ
一応出力してみます

例)
Str_rot13('abcde')
↓
nopqr 

イベントの時とかに使えそうですね。



他にmcryptという関数群があります。
調べてみたら関数たくさんあるのでここでは割愛〜



余談:
量子暗号通信というものがあるそうです。記事みてると意味分からんけど、面白い〜
なんでも一回観測すると状態が変化する量子の性質を使った暗号化だそうで、経路上で観測(盗聴)されたかどうかをチェックできるそうです。すごい。 けどまだ実現されてないっぽいですね

http://www.f5.dion.ne.jp/~mirage/hypams04/quantum_2.html





追記:暗号化とハッシュ化の違いについて。
暗号化は
・復号化可能
・情報を隠蔽したい
・盗み見られても簡単には内容がわからない
<-同じことを説明しているため削除
ハッシュは
・復号化が不可能
・一方向性であることを利用してログイン認証、暗号化鍵にも使われる(終端同士でハッシュ値を計算する)


追記2:
ハッシュが重なる可能性=
md5で2の64乗
=1.84467441 × 10の19乗(google電卓)=18446744100000000000分の1

MD5でもすごい確率低いです


SHA1で2の80乗
=1.20892582 × 10の24乗(google電卓)=1208925820000000000000000分の1!

重複ってあるのでしょうか。