<%@ page contentType="text/html; charset=gb2312"%> 用Java的加密机制来保护你的数据
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
用Java的加密机制来保护你的数据
     发布者: 发布时间:2007-11-26
Java开发工具包 (JDK)对加密和安全性有很好的支持。其中一个优势就是其内置的对Socket通信的支持。因此,很容易做到在服务器和客户之间建立安全的数据流。流Java streams 是一个强大的编程工具。java.io包提供了很多标准的流类型,并能很容易的建立自己的流类型。流的一个有用的特点是和链表一样的简单处理过程。表 A是一个用链表读取文本的例子。ufferedReader br =new BufferedReader(new FileReader(“c:\foo.txt”));String line = null;while((line = br.readLine()) != null) {System.out.println(line);}这段代码将 FileReader和 BufferedReader链接起来。我们在用客户机/服务器应用程序的时候也会用到类似的概念。关键字对于验证来说,关键字很重要,表 B (KeyGen.java)提供了一个称为 getSecretKey的标准方法。通过运行KeyGen来产生一个关键字。因为我们采用同步方法,所以客户机和服务器必须用相同的关键字。isting B?KeyGen.java/** Created by IntelliJ IDEA.* User: jbirchfield* Date: Mar 19, 2002* Time: 9:33:22 AM*/import com.sun.crypto.provider.SunJCE;import javax.crypto.KeyGenerator;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.Security;public class KeyGen {public static final String KEY_FILE = "secret.key";public static final String ALGORITHM = "DES";public static void main(String[] args) {Security.addProvider(new SunJCE());new KeyGen();}public KeyGen() {KeyGenerator kg = null;try {kg = KeyGenerator.getInstance(ALGORITHM);Key key = kg.generateKey();writeKey(KEY_FILE, key);}catch (NoSuchAlgorithmException e) {e.printStackTrace();}}private void writeKey(String filename, Object o) {try {FileOutputStream fos = new FileOutputStream(filename);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(o);oos.flush();fos.close();}catch (IOException e) {e.printStackTrace();}}public static Key getSecretKey() {Security.addProvider(new SunJCE());FileInputStream fis = null;try {fis = new FileInputStream(KEY_FILE);}catch (FileNotFoundException e) {e.printStackTrace();}Key key = null;try {ObjectInputStream ois = null;ois = new ObjectInputStream(fis);key = null;key = (Key) ois.readObject();}catch (IOException e) {e.printStackTrace();}catch (ClassNotFoundException e) {e.printStackTrace();}System.out.println("key = " + key);return key;}}安全socket我们从一个简单的类开始,它提供我们在普通socket对象之上的加密。表 C (SecretSocket.java) 包含了两段代码-Socket和Key对象。我们的构造器创建了变量并初始化了密码:outCipher = Cipher.getInstance(algorithm);outCipher.init(Cipher.ENCRYPT_MODE, key);inCipher = Cipher.getInstance(algorithm);inCipher.init(Cipher.DECRYPT_MODE, key);isting C?SecretSocket.java/** Created by IntelliJ IDEA.* User: jbirchfield* Date: Mar 20, 2002* Time: 9:07:51 AM*/import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;import javax.crypto.CipherInputStream;import javax.crypto.CipherOutputStream;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.NoSuchProviderException;import java.security.Security;public class SecretSocket {private Key key = null;private Cipher outCipher = null;private Cipher inCipher = null;private CipherInputStream cis = null;private CipherOutputStream cos = null;private Socket socket = null;private String algorithm = "DES";public SecretSocket(Socket socket, Key key) {this.socket = socket;this.key = key;algorithm = key.getAlgorithm();initializeCipher();}private void initializeCipher() {try {outCipher = Cipher.getInstance(algorithm);outCipher.init(Cipher.ENCRYPT_MODE, key);inCipher = Cipher.getInstance(algorithm);inCipher.init(Cipher.DECRYPT_MODE, key);}catch (NoSuchAlgorithmException e) {e.printStackTrace();}catch (NoSuchPaddingException e) {e.printStackTrace();}catch (InvalidKeyException e) {e.printStackTrace();}}public InputStream getInputStream() throws IOException {InputStream is = socket.getInputStream();cis = new CipherInputStream(is, inCipher);return cis;}public OutputStream getOutputStream() throws IOException {OutputStream os = socket.getOutputStream();cos = new CipherOutputStream(os, outCipher);return cos;}}因为socket是双向的通信,所以我们采用两个密码。加密输出的数据并解密输入的数据。我们使用getInputStream()和 getOutputStream(),这两种方法来加密合解密通用的输入和输出的经过包装的数据流。见 表 D 。isting Dpublic InputStream getInputStream() throws IOException {InputStream is = socket.getInputStream();cis = new CipherInputStream(is, inCipher);return cis;}public OutputStream getOutputStream() throws IOException {OutputStream os = socket.getOutputStream();cos = new CipherOutputStream(os, outCipher);return cos;}在JCE的javax.crypto包中包含CipherInputStream和 CipherOutputStream这两种流类型。他们接收输入输出的流对象和密码对象。Socket 服务器开始写我们的socket服务器类吧。 表 E (SecretSocketServer.java)是一个完整的列表。SecretSocketServer在一个端口打开ServerSocket,当接收到连接时,使用SocketHandler产生一个线程来操作连接。isting E?SecretSocketServer.java/** Created by IntelliJ IDEA.* User: jbirchfield* Date: Mar 20, 2002* Time: 9:32:17 AM*/import java.net.ServerSocket;import java.net.Socket;import java.io.IOException;public class SecretSocketServer {public static void main(String[] args) {new SecretSocketServer();}public SecretSocketServer() {ServerSocket ss = null;try {ss = new ServerSocket(4444);}catch (IOException e) {e.printStackTrace();}while(true) {try {System.out.println("Waiting...");Socket s = ss.accept();SocketHandler h = new SocketHandler(s);Thread t = new Thread(h);t.start();}catch (IOException e) {e.printStackTrace();}}}}Socket 句柄表 F (SocketHandler.java) 确定一个socket对象,通过KeyGen来定位关键字,并建立一个 SecretSocket 对象。.Key key = KeyGen.getSecretKey();this.ss = new SecretSocket(s, key);isting F?SocketHandler.java/** Created by IntelliJ IDEA.* User: jbirchfield* Date: Mar 20, 2002* Time: 9:34:22 AM*/import java.io.IOException;import java.io.InputStream;import java.net.Socket;import java.security.Key;public class SocketHandler implements Runnable {private Socket s = null;private SecretSocket ss = null;private InputStream in = null;public SocketHandler(Socket s) {this.s = s;Key key = KeyGen.getSecretKey();this.ss = new SecretSocket(s, key);try {in = ss.getInputStream();}catch (IOException e) {e.printStackTrace();}}public void run() {boolean bool = true;while (bool) {bool = listen();}try {s.close();}catch (IOException e) {e.printStackTrace();}}public boolean listen() {int aByte;try {while ((aByte = in.read()) >= 0) {System.out.println((char)aByte);}}catch (IOException e) {System.out.println("returning false...");}return false;}}注意表F中的 ss对SocketHandler来说是一个实变量。所有的socket 处理都是通过SecretSocket而不是Socket对象。然后我们使用下面的代码:in = ss.getInputStream();记住,在SecretSocket中,getInputStream是和CipherInputStream以及 InputStream相结合的。因为SocketHandler 是一个可执行的界面,我们为它生成一个 run()方法。这个方法只是在等待socket的数据:boolean bool = true;while (bool) {bool = listen();}listen方法用来监听socket 。int aByte;while ((aByte = in.read()) >= 0) {system.out.println((char)aByte);}Socket 客户现在我们来看看客户端。见 表 G 。客户端的工作和服务器端很相似,只是反过来了。首先,我们创立一个套接字连接到服务器。使用KeyGen 找到关键字,创立一个安全套接字(SecretSocket)。然后我们利用它的OutputStream给服务器发送数据:Key key = KeyGen.getSecretKey();Socket s = new Socket("localhost", 4444);SecretSocket ss = new SecretSocket(s, key);OutputStream os = ss.getOutputStream();os.write("Hello World!".getBytes());os.flush();os.close();s.close();总结通过JCE中的java流和链表,我们可以轻松的加密基于socket的网络通信。
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
线程堆:给你的线程命名,察看你的系统
修正Java中wait方法超时语意模糊性的一种方案
排序对象
Java线程简介--进阶学习
Java Thread应该注意的问题
Java Thread in JVM
 
最近评论:
        
鍥炲
        
那个雨天的想法!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(5344)
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(8899)
        
那天的情景!
Maple Story mesos,MapleStory mesos,ms mesos,mesos,SilkRoad Gold, max(4560)
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(6278)
        
轻轻走过你的窗前!
world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold, max(8252)
        
轻轻走过你的窗前!
world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(7174)
        
不在的哪天!
final fantasy xi gil,final fantasy xi gil,final fantasy xi gil,final fantasy xi gil, max(161)
        
快乐情人节!
wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap. max(4850)
        
昨夜的狂想曲!
wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(9674)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号