Views
暗号通信
SSL, SSH
パスワードと暗号
- パスワード = 合言葉
- 「有楽町で会いましょう」
- 「山」「川」
- 人が横で聞いていたらばれる
- システムに「平文」で保存してはいけない
パスワードの暗号化
- パスワードを決める ... 暗号化して保存
- パスワードの入力 ... 暗号化して比較
暗号化されたパスワードの例
tkikuchi@fms% /www/bin/htpasswd -c passwd tokio New password: Re-type new password: Adding password for user tokio tkikuchi@fms% cat passwd tokio:gqyee65NFqv9s
暗号化パスワードの解析
tokio:gqyee65NFqv9s
- 最初の2文字 = salt ... ランダム文字
- 残りの11文字 = DES 暗号
- 但し、復号は不可能(と言われている)
パスワードを当ててみる
- ログインできた!
- できた時点でばれてしまう
- crack を使う
自家製 crack
tkikuchi@fms% cat crack.py #!/bin/env python # crack.py import sys import crypt f = open("passwd") user, passwd = f.readline().strip().split(":") salt = passwd[:2] while 1: guess = raw_input("あててみる? ") guesscrypted = crypt.crypt(guess, salt) if passwd == guesscrypted: print "BINGO!" break else: sys.stdout.write("Non, Non. ")
DES 暗号
- Data Encryption Standard
- 既に標準ではない
- DES in Wikipedia
- 8文字ごとに暗号化
- 鍵(Key)は8文字(=56bit)
ビット順の交換による暗号
tkikuchi@fms% cat bitx.py #!/bin/env python # bit 交換関数 def bitx(bits, key): outbits = [] for k in key: outbits.append(bits[int(k)]) return ''.join(outbits) if __name__ == '__main__': bits = "11100110" # "01234567" を以下のように交換 key = "72165430" ciph = bitx(bits, key) print ciph deci = bitx(ciph, key) print deci tkikuchi@fms% ./bitx.py 01111001 11100110
排他論理和による暗号
>>> a = 123456789 >>> b = 987654321 >>> c = a^b >>> c 1032168868 >>> c^b 123456789
共通鍵暗号
- AとBが同じ「鍵」を持つ
- A:「箱」に入れて「鍵」をかける ... 暗号化
- 「箱」を運ぶ
- B:「鍵」で「箱」を開ける ... 復号
共通鍵暗号では
- 「鍵」が合えばBは「箱」の送信者をAと認める
- パスワードはこれを応用
公開鍵暗号
- 2つ「鍵」を持つ。
- 片方の「鍵」で閉じた「箱」はもう一方の「鍵」で開く
- A:Bの「公開鍵」で暗号化
- B:自分の「秘密鍵」で復号
- Bの「公開鍵」は本当にBのものなんだろうか?
- C「認証機関」が証明(署名する)
公開鍵暗号を使った署名
- C:自分の「秘密鍵」で暗号化
- A:Cの「公開鍵」で復号
- 全文を暗号化するのでなく、ハッシュ関数で短くしたものを暗号化
- ハッシュは文のうち1ビットでも違えば全く違う
- 同じハッシュになる文が出てくる確率は非常に小さい
暗号通信
- SSL
- 公開鍵暗号を使って共通鍵を交換
- OpenSSL
- SSH/HTTPS などのライブラリ
SSH
- Secure SHell
- OpenSSH
ssh
- SSH Client
- Terminal (シェル)から起動
- サーバの公開鍵を確認(初めての場合)
- 暗号による鍵の交換 -> 共通鍵による暗号通信
ssh 認証
- ユーザの公開鍵
- あらかじめ公開鍵をサーバに渡しておく
- 秘密鍵で暗号化した署名を送信
- サーバ側で復号できればOK
- パスワード
- (UNIX システムの)ユーザパスワードを暗号化して送信
ssh key の生成
- ssh-keygen
ssh の応用
- scp ... ホスト間のファイルコピー(rcp の代わり)
- sftp ... ftp の代わり
- トンネリング、TCP転送 (X11 など)