分散システム 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/classes/dsys-2003/2004-02-17
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
暗号とは、情報の意味が当事者以外にはわからないように情報を変
換することである。
図? 暗号の考え方
暗号化の方法が秘密になっていると、一見、より強そうにみえる。しかし、そ の暗号が、強いのか弱いのか調べる方法がない。攻撃すると、簡単に落ちるか もしれない。暗号化の方法を提供している者が信頼できない時には使えない。
鍵を長くするだけで、安全性が指数関数的に高くなる。
鍵を1ビット長くすると、解読時間が2倍になる。
(「鍵の長さを2倍にすると解読時間が2倍になる」は、誤り)。
図? 指数関数 図? 指数関数
パスワードは、コンピュータの中では、暗号化の鍵として使われる。 長いパスワードは、破られにくい。1文字(大文字小文字数字記号)増やすと、 総当たりで解読に要する時間が、50倍から100倍近くかかるようになる。
暗号の方法は、大きく2つに分類される
Caesar暗号は、知れている最後の暗号である。 平文アルファベットをN文字ずらした暗号文アルファベットに変える。
N=2 の時の対応表
abcdefghijklmnopqrstuvwxyz CDEFGHIJKLMNOPQRSTUVWXYZAB暗号の説明では、平文を小文字で、暗号文を大文字で書く習慣がある。
N=13 で、大文字小文字を保存する方法を、rot13 暗号という。rot13 は、電 子メールやネットワーク・ニュースで「ネタばらし」の部分を書く時に使われ る。
漢字の場合、rot47 という方法がある。nkf -r で、rot13/47 が使える。
数の集合から、無作為抽出で抜き出された数。
真性乱数。ビット列にすると、0と1の発生確率がそれぞれ1/2で、各ビッ トは他の部分と独立(iid(independent and identically distributed)) である。
物理乱数。量子力学の効果を増幅してディジタル化したもの。 平滑化して0,1のバランスをとれば、真性乱数になる。
疑似乱数(pseudo random number)。種(seed)と呼ばれる入力ビットパタンを基 に計算された、種よりも長いランダムに見えるビット・パタン。種が決まれば 出力乱数は一意に決まる。
例:
乱数表: 0 18 19 22 22 7 9 4 14 3
平文: h e l l o w o r l d 8 5 12 12 15 23 15 18 12 4 暗号文: H W E H K D X V Z G : 8 23 5 8 11 4 24 22 26 7乱数表そのものや、大きな乱数表の中でどこから使い始めるかを鍵にすること ができる。
真性乱数を使うと、解読する方法は数学的に存在しないことが証明されている。
しかし、真性乱数を使うことはコストが大きい。 送信側と受信側で同じ真性乱数を作るのが大変である。
乱数表を記憶する変わりに、疑似乱数を使う方法がある。使う疑似乱数の性質 が悪いと簡単に解読される。
実際には、文字をずらすのではなく、足し算、引き算や、排他的論理和と呼ば れる計算が使われることが多い。
Caesar暗号や乱数を用いる暗号では、平文の文字の順序を変えずに、文字を置き換 える。これを置換暗号という。これにたいして、転置暗号(transposition cipher)では、平文の文字の順序を入れ替えるが、文字の置き換えは行わない。 (下の例では、大文字小文字が変わっているが、これは暗号化の説明のために 変えて書いているだけである。)
次は、転置暗号の1つ、コラム転置の例である。キーは、同じ文字を含まない 1個の単語や熟語である。このキーでコラムに番号付けをする。たとえばコラ ム1は、アルファベットで先頭に近い文字の下のコラムとなる。
MEGABUCK -------- 74512836 -------- pleasetr ansferon emillion dollarst omyswiss bankacco untsixtw otwoabcd
平文: pleasetransferonemilliondollarstomyswissbankaccountsixtwotwo 暗号文: AFLLSKSOSELAWAIATOOSSCTCLNMOMANTESILYNTWRNNTSOWDPAEDOBUOERIRICXB
DES(Data Encryption Standard)は、アメリカ商務省標準局 (NBS, National Bureau of Standard, 現在のNIST, National Institute of Standrds and Technology)が1977年に定めた暗 号標準である。IBM社による提案が元になっている。DESは、 アメリカ政府内で、コンピュータ・データのうち、非機密だが取扱 い注意(unclassified but sensitive)のデータを暗号化するため の標準である。DESを一般の商用にも使うことを推奨している。 たとえば、UNIXのパスワード・ファイルは、DESにより暗号 化されている。
DESは、対称暗号系(慣用暗号系)の1つであり、暗号化と復号 化に同一の鍵(56ビット)を用いる。DESは、転時暗号の一種 である。転時暗号では、平文の文字の順序(コンピュータでは、ビッ ト)を入れ替えるものである。DESでは、64ビットの平文につ いて、鍵をもとにビットの入れ替えを16段繰り返す。
DES は、Unix のパスワードのハッシュ関数として使われている。
DES に変わる新しい標準。全世界に対して公募され、ベルギーのJoan Daemen とVincent Rijmenにより開発されたRijndael方式が採用された。鍵の長さは、 128ビット、192ビット、256ビットから選べる。
暗号やディジタル署名で使われるのは、Collision Proof 性が求められる。
暗号を使えば、一方向関数が作れる(暗号を使わなくても一方向関数を作るこ とはできる)。
one_way_function( x ) { return x をキーとして 0 を暗号化したもの ; }Unix の /etc/passwd に保存されているものは、DES を25回繰り返して使って 作った一方向関数の結果。パスワードそのものは、保存されてない。
チェックサムや CRC (Cyclic Redundancy Check) にも似ているが、一方向関 数としての Collision Proof 性が求められる。
元データが壊れていないか(誰かに改ざんされていないか)を調べる時には、 メッセージ・ダイジェストを計算して比較する。
公開鍵暗号系(非対称暗号系)では2つの異なる鍵を用いる。 便宜上、この2つを公開鍵と秘密鍵と呼ぶ。
これらの鍵は、互いに相手の逆関数になっている。
図? 公開鍵暗号を使った暗号通信の手順
ここで、公開鍵から秘密鍵を計算することは難しい。ある平文を公開鍵で暗号 化してみたところで、秘密鍵を得ることは難しい。
公開鍵暗号の利点は、鍵を管理する手間が掛らないこと。
RSA暗号は、Rivest, Shamir, Adleman の3人によって開発され た公開鍵暗号系である。RSA暗号の安全性は、大きな数を素因数 分解することの難しさに基づく。北米では、RSAは、2000年 に特許が切れた。
公開鍵に基づく暗号化の1つの方法。買得の難しさは、楕円曲線上の離散対数 問題を解くのと同程度と言われている。RSA よりも鍵が短くて高速である。
最近(2002年9月)、Sun がソース・コードを OpenSSL プロジェクトに寄進した。
認証とは、情報の正当性や完全性を確保する技術である。
ディジタル署名では、通常の署名と同様に、次のような性質が必要である。
公開鍵暗号系を使ってディジタル署名を行うことができる。
図? 公開鍵暗号を使ったディジタル署名の手順
メッセージ全体を暗号化する代わりに、メッセージを平文で送り、それにメッ セージを一方向関数(ハッシュ関数)と呼ばれる方法で計算した結果だけを、 秘密鍵で暗号化したものを送る方法もある。一方向関数では、計算結果から元 の値(メッセージ)を計算することが難しい。
ディジタル署名や利用者認証は、公開鍵暗号系ではなく、共通鍵暗号系を用い ても可能である。ただし、この場合、鍵を管理する信用できる管理センターが 必要となる。
サーバへのログインを例に、これを説明する。
単なる暗証番号の場合、通信を傍受されたら終り。 毎回違う数を使えば、傍受されていても平気。
鍵がが本物であるかをどうやって確認するか。
認証には、証明書が使われる。 鍵の交換には、証明書に含まれている
X.509 形式(バイナリ)を、テキストに変換したものの例:
% openssl x509 -text -noout < www3.certCertificate: Data: Version: 3 (0x2) Serial Number: 289038 (0x4690e) Signature Algorithm: sha1WithRSAEncryption Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority Validity Not Before: Nov 26 02:36:34 2003 GMT Not After : Nov 26 02:36:34 2004 GMT Subject: C=JP, O=www3.coins.tsukuba.ac.jp, OU=https://services.choicepoint.net/get.jsp?1808169486, OU=See www.geotrust.com/quickssl/cps (c)03, OU=Domain Control Validated, CN=www3.coins.tsukuba.ac.jp Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:af:df:dc:6e:c8:35:c7:9b:00:b1:f6:ca:50:08: 84:97:0b:00:98:81:15:91:32:91:b0:b8:62:16:aa: c7:a3:b6:8a:43:65:16:12:f1:dc:5d:20:1f:ba:ee: 25:9f:f9:ea:5f:1f:78:c4:0a:5e:db:d3:3c:c5:14: 66:64:aa:67:04:95:a8:54:a9:2a:c9:13:c8:b6:07: 3b:8b:5a:43:de:e6:9a:2e:74:8b:a7:b5:ad:89:28: 93:de:cd:2e:67:be:19:9d:1f:c4:86:a3:ae:4a:9f: b0:d2:b8:92:d3:18:27:58:7a:7d:18:90:97:49:d1: 91:c3:51:32:35:d0:4c:4c:85 Exponent: 65537 (0x10001) X509v3 extensions: Netscape Cert Type: SSL Server X509v3 Key Usage: critical Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment X509v3 Subject Key Identifier: F5:B6:D5:19:16:9E:45:32:4D:C4:DF:C3:5C:FB:26:CC:29:00:F0:D8 X509v3 CRL Distribution Points: URI:http://crl.geotrust.com/crls/secureca.crl X509v3 Authority Key Identifier: keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4 X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha1WithRSAEncryption 45:e4:47:6a:10:d9:34:3c:84:24:4f:50:0c:97:b8:ea:15:7f: f2:d8:ef:c6:c1:60:dd:f7:dd:12:49:24:76:c5:fe:a4:8b:fd: c5:09:6c:43:ca:d0:8e:d9:75:f5:6f:a3:b4:26:52:b3:15:7e: 44:d2:e7:a9:96:83:bd:f1:5c:02:81:1a:f5:40:ca:ea:cf:04: ed:05:02:d2:74:fe:19:79:3d:c3:53:d4:26:36:f9:39:8d:5b: 52:c9:54:ed:34:72:b2:a4:53:74:df:90:02:bb:b9:7c:0a:db: d2:a2:86:55:c0:fe:06:f4:45:d2:00:65:9b:1e:66:96:5a:bc: e9:16 %
![]()
証明書がついていたとして、それが本物であるかをどうやって確認するか。
認証局(CA, Certificate Authority)に、証明書を発行してもらう。(認証局の 秘密鍵でディジタル署名をしてもらう)
その認証局は、信頼できるか?
WWWブラウザには、ルート認証局の証明書が予め含まれている。
末端のWWWサイトは、ルート認証局、または、中間認証局から発行された証 明書を提示する。
接続時に、乱数(共通鍵暗号に基づく暗号化の鍵を生成するため)を交換する。 その乱数は、普通、サーバ側が提示した証明書に含まれている公開鍵で暗号化 される。
ハンドシェークで使われる公開鍵暗号系
データを暗号化するために使われる共通鍵暗号系
---------------------------------------------------------------------- % openssl s_client -connect www3.coins.tsukuba.ac.jp:https -stateCONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=0 /C=JP/O=www3.coins.tsukuba.ac.jp/OU=https://services.choicepoint.net/get.jsp?1808169486/OU=See www.geotrust.com/quickssl/cps (c)03/OU=Domain Control Validated/CN=www3.coins.tsukuba.ac.jp verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 /C=JP/O=www3.coins.tsukuba.ac.jp/OU=https://services.choicepoint.net/get.jsp?1808169486/OU=See www.geotrust.com/quickssl/cps (c)03/OU=Domain Control Validated/CN=www3.coins.tsukuba.ac.jp verify error:num=27:certificate not trusted verify return:1 depth=0 /C=JP/O=www3.coins.tsukuba.ac.jp/OU=https://services.choicepoint.net/get.jsp?1808169486/OU=See www.geotrust.com/quickssl/cps (c)03/OU=Domain Control Validated/CN=www3.coins.tsukuba.ac.jp verify error:num=21:unable to verify the first certificate verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server key exchange A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL_connect:SSLv3 read finished A --- Certificate chain 0 s:/C=JP/O=www3.coins.tsukuba.ac.jp/OU=https://services.choicepoint.net/get.jsp?1808169486/OU=See www.geotrust.com/quickssl/cps (c)03/OU=Domain Control Validated/CN=www3.coins.tsukuba.ac.jp i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority --- Server certificate -----BEGIN CERTIFICATE----- MIIDbzCCAtigAwIBAgIDBGkOMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDMxMTI2MDIzNjM0WhcNMDQxMTI2MDIzNjM0 WjCB5jELMAkGA1UEBhMCSlAxITAfBgNVBAoTGHd3dzMuY29pbnMudHN1a3ViYS5h Yy5qcDE8MDoGA1UECxMzaHR0cHM6Ly9zZXJ2aWNlcy5jaG9pY2Vwb2ludC5uZXQv Z2V0LmpzcD8xODA4MTY5NDg2MTAwLgYDVQQLEydTZWUgd3d3Lmdlb3RydXN0LmNv bS9xdWlja3NzbC9jcHMgKGMpMDMxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZh bGlkYXRlZDEhMB8GA1UEAxMYd3d3My5jb2lucy50c3VrdWJhLmFjLmpwMIGfMA0G CSqGSIb3DQEBAQUAA4GNADCBiQKBgQCv39xuyDXHmwCx9spQCISXCwCYgRWRMpGw uGIWqsejtopDZRYS8dxdIB+67iWf+epfH3jECl7b0zzFFGZkqmcElahUqSrJE8i2 BzuLWkPe5poudIunta2JKJPezS5nvhmdH8SGo65Kn7DSuJLTGCdYen0YkJdJ0ZHD UTI10ExMhQIDAQABo4HBMIG+MBEGCWCGSAGG+EIBAQQEAwIGQDAOBgNVHQ8BAf8E BAMCBPAwHQYDVR0OBBYEFPW21RkWnkUyTcTfw1z7JswpAPDYMDoGA1UdHwQzMDEw L6AtoCuGKWh0dHA6Ly9jcmwuZ2VvdHJ1c3QuY29tL2NybHMvc2VjdXJlY2EuY3Js MB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdJQQWMBQGCCsG AQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQBF5EdqENk0PIQkT1AM l7jqFX/y2O/GwWDd990SSSR2xf6ki/3FCWxDytCO2XX1b6O0JlKzFX5E0ueploO9 8VwCgRr1QMrqzwTtBQLSdP4ZeT3DU9QmNvk5jVtSyVTtNHKypFN035ACu7l8CtvS ooZVwP4G9EXSAGWbHmaWWrzpFg== -----END CERTIFICATE----- subject=/C=JP/O=www3.coins.tsukuba.ac.jp/OU=https://services.choicepoint.net/get.jsp?1808169486/OU=See www.geotrust.com/quickssl/cps (c)03/OU=Domain Control Validated/CN=www3.coins.tsukuba.ac.jp issuer=/C=US/O=Equifax/OU=Equifax Secure Certificate Authority --- No client certificate CA names sent --- SSL handshake has read 1439 bytes and written 314 bytes --- New, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA Server public key is 1024 bit SSL-Session: Protocol : TLSv1 Cipher : EDH-RSA-DES-CBC3-SHA Session-ID: F4DB8869CD14EB45493AAD206EEB5242EB19F2E4998EAC152F17F0822723EA13 Session-ID-ctx: Master-Key: A67B1587583ED73F417A3054C776A4BA266FEBD15163B38CD00C87512EC152BC5F49FC541E5EAB474CCD90915866DD34 Key-Arg : None Start Time: 1076860367 Timeout : 300 (sec) Verify return code: 0 (ok) --- GET /~yas/ HTTP/1.0
![]()
HTTP/1.1 200 OK Date: Sun, 15 Feb 2004 15:53:00 GMT Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) mod_ssl/2.8.12 OpenSSL/0.9.6 DAV/1.0.2 PHP/4.1.2 mod_perl/1.24_01 mod_throttle/3.1.2 Last-Modified: Fri, 23 May 2003 09:03:22 GMT ETag: "6ef4122-1a5-3ecde3da" Accept-Ranges: bytes Content-Length: 421 Connection: close Content-Type: text/html <HTML> <HEAD> <TITLE> SHINJO,Yasushi / Secure WWW </TITLE> </HEAD> <BODY> <H1>内容</H1> <UL> <LI> <A HREF="coins-admin/2003/d/tiki.cgi">coins-admin 用 Tiki (2003)</A> <LI> <A HREF="j03/d/tiki.cgi">情報学類2003年度入学生のための Tiki (2003)</A> </UL> <HR> <BR> <ADDRESS> <A HREF="http://www.is.tsukuba.ac.jp/~yas/">Yasushi Shinjo</A> / <yas@is.tsukuba.ac.jp> </ADDRESS> </BODY> </HTML> SSL3 alert read:warning:close notify closed SSL3 alert write:warning:close notify %
----------------------------------------------------------------------
---------------------------------------------------------------------- 1: 2: /* 3: SSLEchoClient.java -- 文字列を送受信するクライアント(SSL版) 4: ~yas/syspro/ipc/SSLEchoClient.java 5: */ 6: 7: import java.net.*; 8: import java.io.*; 9: import javax.net.*; 10: import javax.net.ssl.*; 11: 12: class SSLEchoClient 13: { 14: public static void main(String argv[]) throws IOException { 15: if( argv.length != 2 ) 16: { 17: System.err.println("Usage: % java SSLEchoClient host port"); 18: System.exit( -1 ); 19: } 20: String server = argv[0]; 21: int portno = Integer.parseInt( argv[1] ); 22: SSLEchoClient ec = new SSLEchoClient( server, portno ); 23: ec.run(); 24: } 25: 26: static BufferedReader stdin = 27: new BufferedReader( new InputStreamReader(System.in) ); 28: static PrintStream stdout = System.out; 29: static PrintStream stderr = System.err; 30: 31: String server ; 32: int portno ; 33: 34: SSLEchoClient( String server, int portno ) 35: { 36: this.server = server ; 37: this.portno = portno ; 38: } 39: void run() throws IOException 40: { 41: stdout.println("server =="+server+", portno=="+portno); 42: 43: Socket sock = makeSSLClientSocket( server, portno ); 44: BufferedReader in = new BufferedReader( 45: new InputStreamReader( sock.getInputStream() )); 46: PrintStream out = new PrintStream( sock.getOutputStream() ); 47: System.out.print("==> "); 48: String line; 49: while( (line = stdin.readLine())!= null ) 50: { 51: stdout.println("sending: ["+line +"]"); 52: out.println( line ); 53: String rline = in.readLine(); 54: stdout.println("received: ["+rline+"]"); 55: stdout.print("==> "); 56: } 57: stdout.println(""); 58: in.close(); 59: out.close(); 60: sock.close(); 61: } 62: static SSLSocket makeSSLClientSocket( String server, int portno ) 63: throws java.io.IOException 64: { 65: SSLSocket ss; 66: SSLSocketFactory ssf = (SSLSocketFactory)SSLSocketFactory.getDefault(); 67: Socket s = new Socket( server, portno ); 68: ss = (SSLSocket) ssf.createSocket(s,server,portno,true); 69: return( ss ); 70: } 71: } ----------------------------------------------------------------------通常の Socket 版と違う所は、makeSSLClientSocket() だけ。
---------------------------------------------------------------------- 1: 2: /* 3: SSLEchoServer.java -- 文字列を送受信するサーバ(SSL版) 4: ~yas/syspro/ipc/SSLEchoServer.java 5: */ 6: 7: import java.net.*; 8: import java.io.*; 9: import javax.net.ssl.*; 10: 11: class SSLEchoServer 12: { 13: public static void main(String argv[]) throws IOException { 14: if( argv.length != 1 ) 15: { 16: System.err.println("Usage: % java SSLEchoServer port"); 17: System.exit( -1 ); 18: } 19: int portno = Integer.parseInt( argv[0] ); 20: SSLEchoServer es = new SSLEchoServer( portno ); 21: es.run(); 22: } 23: 24: static BufferedReader stdin = 25: new BufferedReader( new InputStreamReader(System.in) ); 26: static PrintStream stdout = System.out; 27: static PrintStream stderr = System.err; 28: 29: String server ; 30: int portno ; 31: 32: SSLEchoServer( int portno ) 33: { 34: this.portno = portno ; 35: } 36: void run() throws IOException 37: { 38: stdout.println("SSLEchoServer.run(): portno=="+portno); 39: 40: ServerSocket acc = makeSSLServerSocket( portno ); 41: while( true ) 42: { 43: stdout.println(Thread.currentThread()+": Waiting ..."); 44: final Socket sock = acc.accept(); 45: stdout.println(Thread.currentThread()+": Arrived."); 46: Thread th = new Thread() { 47: public void run() { 48: try { 49: echo( sock ); 50: } 51: catch( IOException ignored ) {} 52: } 53: }; 54: th.start(); 55: } 56: } 57: void echo( Socket sock ) throws IOException 58: { 59: BufferedReader in = new BufferedReader( 60: new InputStreamReader( sock.getInputStream() )); 61: PrintStream out = new PrintStream( sock.getOutputStream() ); 62: String line; 63: while( (line = in.readLine())!= null ) 64: { 65: stdout.println(Thread.currentThread()+": Received and replying ["+line+"]"); 66: out.println( line ); 67: } 68: stdout.println(Thread.currentThread()+": Connection closed."); 69: in.close(); 70: out.close(); 71: sock.close(); 72: } 73: static SSLServerSocket makeSSLServerSocket(int portno) 74: throws java.io.IOException 75: { 76: SSLServerSocket ss; 77: SSLServerSocketFactory ssf = (SSLServerSocketFactory) 78: SSLServerSocketFactory.getDefault(); 79: ss = (SSLServerSocket) ssf.createServerSocket(portno); 80: return( ss ); 81: } 82: } ----------------------------------------------------------------------
keytool -genkey で、秘密鍵と公開鍵の組が作られる。秘密鍵は、暗号化され る。公開鍵は、X509証明書の形で保存される。公開鍵は、暗号化は行われてい ない。keytool -list でパスワードを与えなくても表示される。---------------------------------------------------------------------- % ls -l ./echo.keystorels: ./echo.keystore: No such file or directory % keytool -genkey -keystore ./echo.keystore -storepass "open sesame" -alias echo -keypass "open sesame"
What is your first and last name? [Unknown]: THM_User(Yasushi Shinjo)
What is the name of your organizational unit? [Unknown]: THM_User(Colleage of Information Sciences)
What is the name of your organization? [Unknown]: THM_User(University of Tsukuba)
What is the name of your City or Locality? [Unknown]: THM_User(Tsukuba)
What is the name of your State or Province? [Unknown]: THM_User(Ibaraki)
What is the two-letter country code for this unit? [Unknown]: THM_User(JP)
Is CN=Yasushi Shinjo, OU=Colleage of Information Sciences, O=University of Tsuku ba, L=Tsukuba, ST=Ibaraki, C=JP correct? [no]: THM_User(yes)
% ls -l ./echo.keystore
-rw-r--r-- 1 yas lab 1336 Feb 16 00:31 ./echo.keystore % keytool -list -keystore ./echo.keystore
Enter keystore password:
***************** WARNING WARNING WARNING ***************** * The integrity of the information stored in your keystore * * has NOT been verified! In order to verify its integrity, * * you must provide your keystore password. * ***************** WARNING WARNING WARNING ***************** Keystore type: jks Keystore provider: SUN Your keystore contains 1 entry echo, Feb 16, 2004, keyEntry, Certificate fingerprint (MD5): B8:71:6E:CF:6A:BB:4E:6C:06:69:DD:44:DA:12:F7:4C %
----------------------------------------------------------------------
サーバは自動的には停止しないので、最後は^Cで止める。 ポート番号としては、適当に外の人とぶつからないものを与える。---------------------------------------------------------------------- % javac SSLEchoServer.java% java -Djavax.net.ssl.keyStore=./echo.keystore -Djavax.net.ssl.keyStorePassword="open sesame" SSLEchoServer 1231
SSLEchoServer.run(): portno==1231 Thread[main,5,main]: Waiting ... Thread[main,5,main]: Arrived. Thread[main,5,main]: Waiting ... Thread[Thread-1,5,main]: Received and replying [1st line] Thread[Thread-1,5,main]: Received and replying [2nd line] Thread[Thread-1,5,main]: Received and replying [bye] Thread[Thread-1,5,main]: Connection closed. ^C ----------------------------------------------------------------------
クライアント側は、keystore 全体は不用である。公開鍵を含む証明書だけが あればよい。正式な方法は、keystore ファイルから keytool -export で証明 書を取り出し、別の keystore ファイルに -import で取り込むことである。 しかし、秘密鍵は暗号化されてるので、上のように秘密鍵を含んだままの keystore のファイルをコピーして与る方法もある。---------------------------------------------------------------------- % javac SSLEchoClient.java% java -Djavax.net.ssl.trustStore=./echo.keystore SSLEchoClient localhost 1231
server ==localhost, portno==1231 ==> 1st line
sending: [1st line] received: [1st line] ==> 2nd line
sending: [2nd line] received: [2nd line] ==> bye
sending: [bye] received: [bye] ==> ^D %
----------------------------------------------------------------------
OpenSSL で作成した秘密鍵や証明書を、Java の keystore 形式に変換するこ ともできる。
Socket 版
/* Returns the number of characters successfully written */ size_t write(int file_descriptor, void *buf, size_t len)
OpenSSL 版
/* Returns the number of characters successfully written */ int SSL_write(SSL *socket_info, char *buf, int len)
実際には、秘密鍵や証明書の設定がめんどくさい。そうするよりも、stunnel コマンドをパイプ経由で実行した方が楽である。
p = run_cmd("stunnel -c -r 192.168.100.1:imap2 -A /etc/ca_certs -v 3");
http://www-6.ibm.com/jp/developerworks/security/011005/j_s-stun.html
コンパイルは通るが、秘密鍵や証明書の設定の部分がないのでうまく動作しない。
コンパイルは通るが、秘密鍵や証明書の設定の部分がないのでうまく動作しない。
IP spoofing (なりすまし).
rsh のセッションで行われるであろうパケットを偽造する。
IP アドレスでホストを認証すると危ない。
DNS spoofing.
偽のDNSのサーバを立てる。
サーバは、2つの鍵と64ビットの乱数を送る。 クライアントは、乱数を送り返す。 乱数が一致したら、IP spoofing されていない。
クライアントは、セッション鍵(対称暗号系の鍵)をサーバの2つの公開鍵で 暗号化して送る。
対象暗号の鍵(セッション鍵)を生成し、公開鍵で送る。
これ以降の通信は、セッション鍵で暗号化される。
個人ごとに RSA 公開鍵での認証機能を利用したほうがよい。
よくつかわれるもの。
% cat bin/ssh-coins-mail#!/bin/sh host=mail.coins.tsukuba.ac.jp ssh -L 10143:$host':'143 -L 10110:$host':'110 -L 10025:$host':'25 $host $* %
![]()
自分自身(localhostが便利)のポート番号10143, 10110, 10025 に来た接続要
求を、リモートの host の143, 110, 25 に転送する。ssh の接続先(最後の
$host)と、-L で指定するホストは必ずしも一致していなくてもよい。
ssh コマンドは、Unix、MacOSX、Cygwin で使える。Windows の TeraTerm や
PuTTY でも使える。
図 ssh によるトンネリング(SMTP、POP、IMAP)
---------------------------------------------------------------------- % telnet localhost 10143Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. * OK [CAPABILITY IMAP4REV1 LOGIN-REFERRALS STARTTLS AUTH=LOGIN] orchid-a.coins.tsukuba.ac.jp IMAP4rev1 2001.315rh at Mon, 3 Mar 2003 00:23:09 +0900 (JST) * login yas XXXXXXXX
* OK [CAPABILITY IMAP4REV1 IDLE NAMESPACE MAILBOX-REFERRALS SCAN SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND] User yas authenticated * select #mh/inbox
* 144 EXISTS * 0 RECENT * OK [UIDVALIDITY 1046618627] UID validity status * OK [UIDNEXT 145] Predicted next UID * NO [UIDNOTSTICKY] Non-permanent unique identifiers: #mh/inbox * FLAGS (\Answered \Flagged \Deleted \Draft \Seen) * OK [PERMANENTFLAGS ()] Permanent flags * OK [UNSEEN 144] first unseen message in #mh/inbox * OK [READ-WRITE] SELECT completed * logout
* BYE orchid-a.coins.tsukuba.ac.jp IMAP4rev1 server terminating connection * OK LOGOUT completed Connection closed by foreign host. %
----------------------------------------------------------------------
SSH2 を使った方がよい。
RSA社が提唱している公開鍵を使ってセッション鍵(秘密鍵)を交換する 方式(PKCS1 1.5 )そのものに、脆弱性がある [1]。
PKCS -- Public-Key Cryptography Standards
[1] Daniel Bleichenbacher, "Chosen ciphertext attacks on RSA encryption standard PKCS #1", Advances in Cryptology, CRYPTO 98. Springer.
サーバ鍵を1時間に1回しか変えない。
SSH 1.5 は、1024 ビットの鍵を使っている。 これを破るには、2 20 + 2 19 回接続でよい。毎 秒、約 400 回。
1個所からの接続に上限を付ける。OpenSSH はそうなっている。 Distributed 攻撃には、弱そう。
OpenSSH
http://www.openssh.org/