安全套接子编程
来源:互联网 发布:数据库通配符%表示什么 编辑:程序博客网 时间:2024/05/02 07:16
安全套接字编程示例
安全套接字(Security Socket Layer)是在Socket的基础上加入加密机制而产生的.应用在安全性要求比较的场合.比如VPN(Virtual privacy network)中,可以实现点对点的隧道通信机制.在SVN(一个应用比较广泛的开源的版本控制软件)中,如果你只希望你代码通过网络checkin/checkout的时候不被恶意的读取,则可以启用SSL,这样传输过程中的源代码是以密文的形式传输的,即使被网络上的恶意截获,没有加密的密码,仍然可以保证您的源代码的安全性.下面是SSL握手过程:
(1)客户发送消息到服务器,要求SLL连接,并且提供它所支持的加密解密算法列表
(2)服务器通过发送包含公钥的证书,并发送建议(基于客户机和服务器的能力,应该施用哪个密码组)来响应
(3)客户施用收到的证书和可信任的CA对服务器进行验证,客户使用服务器的公钥对一条称为预制作秘密的数据加密,并发送到服务器
(4)服务器使用自己的私钥解密预制作秘密
(5)通过将预制作秘密作为由SSL定义的算法的输入,客户机和服务器都产生会话秘钥.现在会话秘匙是客户机和服务器共享的秘密,其他人不知道.
(6)客户机和服务器交换信息表示握手结束.会话中以后的消息都使用秘钥加密,并且包括了MAC(Message Digest Code),以便检测任何对数据的篡改.
java 提供了对SSL的支持,所以下面是用java写的服务器和客户代码
/*SecureServer.java*/import java.io.*;import java.net.*;import javax.net.ssl.*;import javax.crypto.*;import java.security.*;import java.util.StringTokenizer;public class SecureServer{ private int port; static final int DEFAULT_PORT=8189; static final String KEYSTORE="jpatkeystore.ks"; static final String TRUSTSTORE="jpattruststore.ks"; static final String STOREPASSWD="changeit"; static final String ALIASPASSWD="changeit"; SecureServer(int port) { this.port=port; } public void run() { try { KeyStore ks=KeyStore.getInstance("JCEKS"); ks.load(new FileInputStream(KEYSTORE),STOREPASSWD.toCharArray()); KeyStore ts=KeyStore.getInstance("JCEKS"); ts.load(new FileInputStream(TRUSTSTORE),STOREPASSWD.toCharArray()); KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509"); kmf.init(ks,ALIASPASSWD.toCharArray()); TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509"); tmf.init(ts); SSLContext sslContext=SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null); SSLServerSocketFactory sslServerFactory=sslContext.getServerSocketFactory(); SSLServerSocket sss=(SSLServerSocket)sslServerFactory.createServerSocket(port); sss.setEnabledCipherSuites(sss.getSupportedCipherSuites()); SSLSocket incoming=(SSLSocket)sss.accept(); BufferedReader in=new BufferedReader(InputStreamReader(incoming.getInputStream())); PrintWriter out=new PrintWriter(incoming.getOutputStream(),true); String str; while(!(str=in.readLine()).equals(" ")) { double result=0; StringTokenizer st=new StringTokenizer(str); try { while(st.hasMoreTokens()) { Double d=new Double(st.nextToken()); result+=d.doubleValue(); } out.println("The result is"+result); } catch(NumberFormatException nfe) { out.println("invalid input number!"); } } incoming.close(); } catch(Exception x) { System.out.println(x); x.printStackTrace(); } } public static void main(String[] args) { int port=DEFAULT_PORT; if(args.length>0) { port=Integer.parseInt(args[0]); } SecureServer addServer=new SecureServer(port); addServer.run(); }}/*SecureClient.java*/import java.io.*;import java.net.*;import javax.net.ssl.*;import java.security.KeyStore;public class SecureClient{ private InetAddress host; private int port; static final int DEFAULT_PORT=8189; static final String KEYSTORE="jpatkeystore.ks"; static final String TRUSTSTORE="jpattruststore.ks"; static final String STOREPASSWD="changeit"; static final String ALIASPASSWD="changeit"; SecureClient(InetAddress host,int port) { this.host=host; this.port=port; } public void run() { try { KeyStore ks=KeyStore.getInstance("JCEKS"); ks.load(new FileInputStream(KEYSTORE),STOREPASSWD.toCharArray()); KeyStore ts=KeyStore.getInstance("JCEKS"); ts.load(new FileInputStream(TRUSTSTORE),STOREPASSWD.toCharArray()); KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509"); kmf.init(ks,ALIASPASSWD.toCharArray()); TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509"); tmf.init(ts); SSLContext sslContext=SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null); SSLSocketFactory sslFact=sslContext.getSocketFactory(); SSLSocket client=(SSLSocket)sslFact.createSocket(host,port); client.setEnabledCipherSuites(client.getSupportedCipherSuites()); BufferedReader socketIn=new BufferedReader(InputStreamReader(client.getInputStream())); PrintWriter socketOut=new PrintWriter(client.getOutputStream(),true); String numbers="1.2 3.4 5.6"; System.out.println("Adding the numbers"+numbers+"together securely"); socketOut.println(numbers); System.out.println(socketIn.readLine()); socketOut.println(" "); } catch(Exception x) { System.out.println(x); x.printStackTrace(); } } public static void main(String[] args) { try { InetAddress host=InetAddress.getLocalHost(); int port=DEFAULT_PORT; if(args.length>0) { port=Integer.parseInt(args[0]); } if(args.length>1) { host=InetAddress.getByName(args[1]); } SecureClient addClient=new SecureClient(host,port); addClient.run(); } catch(UnknownHostException uhx) { System.out.println(uhx); uhx.printStackTrace(); } }}
- 安全套接子编程
- Java 安全套接字编程以及 keytool 使用最佳实践
- Java 安全套接字编程以及 keytool 使用最佳实践
- Java 安全套接字编程以及 keytool 使用最佳实践
- Java 安全套接字编程以及 keytool 使用最佳实践
- Java 安全套接字编程以及 keytool 使用最佳实践
- 安全套接层SSL
- SSL 安全套接层
- 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
- 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
- 《Unix网络编程卷1-套接字联网API》第一个例子编译
- 安全套接字层 (SSL)
- 安全套接层SSL协议
- 安全套接层SSL协议
- openssl 安全套接层协议
- SSL协议,安全套接层
- 安全套接层(SSL)协议
- TCP套接字编程
- ref和out 转贴
- JBOSS4.0 JDBC数据源配置大全(一)
- 今天在网上发现一个不错的软件外包的网站
- JBOSS4.0 JDBC数据源配置大全(二)
- 一家之言
- 安全套接子编程
- 破解SQL Server连接错误-“用户xx登录失败,原因:未与信任 SQL Server 连接相关”
- 博客中国被黑了
- 灯谜常用扣法
- 几个重要的RedHat Linux内核文件介绍
- 招聘广告
- 柔性管理(Soft Management)
- dos版电影 (telnet towel.blinkenlights.nl的奇迹!!)-STAR WARS in ARCII
- 算法每日一题:12、八个数