Views
パスワードと暗号
前回の問題
- 脆弱性 (ぜいじゃくせい)
- 原因
- バッファオーバーフロー
- SQL インジェクション
- クロスサイトスクリプティング
パスワードと暗号
- パスワード = 合言葉
- 「有楽町で会いましょう」
- 「山」「川」
- 人が横で聞いていたらばれる
- システムに「平文」で保存してはいけない
パスワードの暗号化
- パスワードを決める ... 暗号化して保存
- パスワードの入力 ... 暗号化して比較
暗号化されたパスワードの例
$ /sw/www/bin/htpasswd -c passwd tokio New password: Re-type new password: Adding password for user tokio $ cat passwd tokio:gqyee65NFqv9s
暗号化パスワードの解析
tokio:gqyee65NFqv9s
- 最初の2文字 = salt ... ランダム文字
- 残りの11文字 = DES 暗号
- 但し、復号は不可能(と言われている)
パスワードを当ててみる
- ログインしてみる
- 何度もパスワード間違いの記録が残る
- crack を使う
自家製 crack
#!/usr/bin/env python # -*- coding: utf-8 -*- # 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: print "Non, Non.",
DES 暗号
- Data Encryption Standard
- 既に標準ではない
- DES in Wikipedia
- 8文字ごとに暗号化
- 鍵(Key)は8文字(=56bit)
ビット順の交換による暗号
#!/usr/bin/env python # -*- coding: utf-8 -*- # 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
$ ./bitx.py 01111001 11100110
排他論理和による暗号
>>> a = 123456789 >>> b = 987654321 >>> c = a^b >>> c 1032168868 >>> c^b 123456789
DES 暗号は
- おおざっぱに言うと
- ビット交換と排他論理和を 16 回実行
共通鍵暗号
- AとBが同じ「鍵」を持つ
- A:「箱」に入れて「鍵」をかける ... 暗号化
- 「箱」を運ぶ
- B:「鍵」で「箱」を開ける ... 復号
共通鍵暗号では
- 「鍵」が合えばBは「箱」の送信者をAと認める
- パスワードはこれを応用
共通鍵暗号 illustrated
公開鍵暗号
- 2つ「鍵」を持つ。
- 片方の「鍵」で閉じた「箱」はもう一方の「鍵」で開く
- A:Bの「公開鍵」で暗号化
- B:自分の「秘密鍵」で復号
- Bの「公開鍵」は本当にBのものなんだろうか?
- C「認証機関」が証明(署名する)
公開鍵暗号を使った署名
- C:自分の「秘密鍵」で暗号化
- A:Cの「公開鍵」で復号
- 全文を暗号化するのでなく、ハッシュ関数で短くしたものを暗号化
- ハッシュは文のうち1ビットでも違えば全く違う
- 同じハッシュになる文が出てくる確率は非常に小さい
公開鍵暗号 illustrated
暗号・署名ツール
- PGP ... Pretty Good Privacy
- GPG ... GNU Privacy Guard
GPG の使い方
- A -> B へ暗号を送る
- B の公開鍵を入手
- gpg --import Bの公開鍵
- gpg -ea -r B -o text.gpg text.txt
- text.txt ... 元の平文 | text.gpg ... 暗号文
B が受け取ったら
- gpg text.gpg
- 自分の秘密鍵使用のパスワードを入れる
- text に平文ができる
GPG で暗号化されたメッセージの例
-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.4 (Darwin) hQIOA33/fYzLqW99EAgAzej9QjKyZEDy3E7Bjh9Zrb1KBmaIztHAQprC0dpVzdV1 pq9gnYU3T1oL1I4n2NaMF7zZrndaS6frS3NCdo4dQwqvTyNj0Eo7eA3Yg0oBz1zx SaGw3E3DVNA1V4vaZnzfYt3RYZlWOz1kXoMP0WYjFkDcuHNPF6JmvpkWdtp/aLAI c8QJkn/HsOfUyu35JbXxxorl+2a83h267CRatEhQb0Xx80G1OKHytwIPOi45/9HN Q8p4cipjc1J9CPpokcTho0JTZVLQcTIIGiAIp0lJ3lC8b9/vZpxxFXEgykvWDfMu v6egbcAulU0HCidrb6SmXqjOp1TKyvn/qbHiDomCjwgAqcNlin9PSTnxz4ZLVE2f ZYecE7d2odA3NhoacM4nKc8LYRyHBoRVY9jh5jsFUeEW0ir3zNNsXz1RRf2TD7t8 +f52SEbmAwsFM7WUadhfniiBsl3FIFj7zJ2VpCVGPVl8SdL0Zt15CjwpDn14N1FK 4wbqsDgu8dNzFUeWpnXnYNGhysLXLk3n00Jp4J2ooFI84JzVnLIDjENU1r74Fefv TkZJYcmF1ygCNqv1h5R49vSStrHRv42VqcrZbSh4R+Ycjf+y+QmhtPQWYSUbx1Us 1yombaFHkp+lq2IAZ8W9Wd+afudPkJJb6VVPtfIo3uPvLRddlptoagC5+ze9Jogj DNJeAU9a33WYj4wPLOAi7iE2bBr4a+WESdI9mZgEmywJjqL+RYwG64Zq+G6q94yi YnT2U1/7OjsljnwmAZRCRdpGAzrWhoeKR2sbXSwWjumSbcv1KE4/HSb262FHO6mx ZA== =E+9r -----END PGP MESSAGE-----
復号を実演
- この暗号文は私しか読めません。
- 読んでみせます。
- あとで問題に出します。
HTTPS
- SSL (Secure Socket Layer)
- ブラウザに「認証機関」の公開鍵を持つ
- サーバ側のBが正しいことを認める
- 乱数で共通鍵を生成
- Bの公開鍵で暗号化した共通鍵をサーバに送り、以後の通信を暗号化する
HTTPS(図解)
正しく認証されたサイト
- と、そうでないサイト
- 生協ショッピングサイト
- 自己認証のサイト
- SSL証明書販売サイト (の例)
SSH/SFTP/SCP
- telnet ... パスワードが平文でネットを流れる
- ssh ... SSL を用いてログイン
- sftp/scp ... ファイル転送
- この とおりです。
POP/SMTP 認証
本日の問題
- 暗号で書かれていた文を書いてください。
- ヒント:「王様は はだか だ!」ではありません
- その他感想など、どうぞ。