- 浏览: 1060342 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
由于项目需要需要研究下hessian的加密传输。于是翻出hessian源码,发现com.caucho.hessian.security包下面有两个类X509Encryption和X509Signature,一个是用来加密解密的,一个是用来签名认真的。很遗憾hessian虽然提供了这两项功能但是它并没有使用上去,甚至还没有给我们开了口子来使用它。仍然不甘心,于google,baidu,bing多方搜索hessian的内置加密方式如何使用,仍然没有结果。没有办法只能自己来提供对传输的数据进行加密和解密的方式了。在这里提供了两套加密解密方式:非对称密钥的RSA和对称密钥的AES。
一、 非对称密钥加密算法RSA
非对称密钥算法需要一对密钥:公开密钥和私有密钥。利用公开密钥进行加密后的信息,只有用对应的私有密钥才能解密。因为加密和解密用的密钥是不一样的,因此,公开密钥是公开的,供所有人使用,并且不会威胁到传递信息和解密密钥的安全,不需要对密钥传递的额外保护。首先,提供RSA的密钥生成算法,生成公有密钥和私有密钥存入文件中:且看 RSAKeyCreater.java
RSAKeyCreater类中createKeyFile()方法生成公钥和私钥分别保存到public_key_file.rsa和private_key_file.rsa文件中,加密和解密时进行使用。
其次,提供加密解密算法,对byte[] 进行加密和解密:且看RSAEncryptionUtil.java
RSAEncryptionUtil的encryptWithPublicKey()方法对信息进行加
密,decryptWithPrivateKey()方法对加密后的信息进行解密,分别需要传入公有和私有密钥。
由于提供的算法是对byte[]数组进行加密和解密返回新的byte[],因此我们需要提供一个普通object对象到byte[]之间转化的工具:且看SerializationUtil.java
SerializationUtil类中的serialize()方法将普通java对象序列化成byte[],deserialize()方法将byte[]反序列化成原来的对象。
RSA加密算法有个特点,就是对加密明文和密文的长度有限制,当我们加密的明文过长时,我们需要对明文分块进行加密,因此那种长度较短的信息进行加密适合使用RSA算法。一般来说,我们进行加密的对象序列化成byte[]数组之后长度都超过了RSA加密算法的要求,因此我们可以选用另一种加密算法:AES。
二、 对称密钥加密算法AES
对称密钥算法中,信息的加密和解密都是使用相同的密钥,使用起来简单,速度快,但在使用之前,需要通过额外安全的途径交换加密密钥。首先,提供AES密钥生成算法,生成密钥保存在文件中,且看AESKeyCreater.java
AESKeyCreater类中createKeyFile()方法生成AES算法的密钥,保存在AES_Secret_Key_File.aes文件中,供加密和解密时使用。
其次,提供加密解密算法,对byte[] 进行加密和解密:且看AESEncryptionUtil.java
AESEncryptionUtil类中encryptMessage()方法对信息进行加密,decryptMessage()方法对信息进行解密,都需要传入AES密钥文件。由于都是对byte[]数组进行加密和解密,因此也需要RSA算法中提供的普通Object对象和byte[]之间的映射工具。
下面给出AES算法对hessian进行加密和解密传输,思路:客户端通过Hessian工厂获取到Hessian服务之后,将传入参数对象序列化成byte[],然后对byte[]进行加密,然后调用hessian服务的方法,服务端获取到客户端传过来的加密之后的byte[]参数,首先进行AES解密,然后将byte[]反序列化成参数对象,再调用相应的业务逻辑,再然后将返回结果进行序列化成byte[],然后进行AES加密,然后客户端获得返回结果之后进行AES解密,然后反序列化成结果对象,至此一轮调用完成。且看hessian服务接口:EncryptionService.java
由于hessian是一个二进制协议,非常适合传输二进制数据,以byte[]作为参数和返回结果是非常合适的,将来这部分完全可以做在框架之中。且看hessian服务实现类:EncryptionServiceImpl.java
代码一目了然,没啥好说的。且看客户端调用:TestClient.java
1./**
2. * @author zhangwei
3. *
4. */
5.public class TestClient {
【转载地址】http://zwustudy.iteye.com/blog/1679850
一、 非对称密钥加密算法RSA
非对称密钥算法需要一对密钥:公开密钥和私有密钥。利用公开密钥进行加密后的信息,只有用对应的私有密钥才能解密。因为加密和解密用的密钥是不一样的,因此,公开密钥是公开的,供所有人使用,并且不会威胁到传递信息和解密密钥的安全,不需要对密钥传递的额外保护。首先,提供RSA的密钥生成算法,生成公有密钥和私有密钥存入文件中:且看 RSAKeyCreater.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public class RSAKeyCreater { 6. 7. /** 8. * @param args 9. * @throws Exception 10. */ 11. public static void main(String[] args) throws Exception { 12. RSAKeyCreater rSAKeyCreater = new RSAKeyCreater(); 13. rSAKeyCreater.createKeyFile(512, System.getProperty("user.dir")); 14. } 15. 16. public void createKeyFile(int in, String url) throws Exception { 17. KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 18. kpg.initialize(in); 19. KeyPair kp = kpg.genKeyPair(); 20. PublicKey publicKey = kp.getPublic(); 21. PrivateKey privateKey = kp.getPrivate(); 22. 23. File file1 = new File(url + "/src/main/resources/public_key_file.rsa"); 24. FileOutputStream publicOut = new FileOutputStream(file1); 25. ObjectOutputStream publicObjectOutput = new ObjectOutputStream(publicOut); 26. publicObjectOutput.writeObject(publicKey); 27. publicObjectOutput.flush(); 28. publicObjectOutput.close(); 29. 30. File file2 = new File(url + "/src/main/resources/private_key_file.rsa"); 31. FileOutputStream privateOut = new FileOutputStream(file2); 32. ObjectOutputStream privateObjectOutput = new ObjectOutputStream(privateOut); 33. privateObjectOutput.writeObject(privateKey); 34. privateObjectOutput.flush(); 35. privateObjectOutput.close(); 36. } 37.}
RSAKeyCreater类中createKeyFile()方法生成公钥和私钥分别保存到public_key_file.rsa和private_key_file.rsa文件中,加密和解密时进行使用。
其次,提供加密解密算法,对byte[] 进行加密和解密:且看RSAEncryptionUtil.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public class AESEncryptionUtil { 6. /** 7. * 加密 8. * @param bytes 9. * @param aesKey 10. * @return 11. */ 12. public static byte[] encryptMessage(byte[] bytes, String aesKey) { 13. try { 14. Object obj = KeyUtil.getKey(aesKey); 15. SecretKey key = (SecretKey) obj; 16. Cipher cipher = Cipher.getInstance("AES"); 17. cipher.init(Cipher.ENCRYPT_MODE, key); 18. byte[] decryptedBytes = cipher.doFinal(bytes); 19. return decryptedBytes; 20. } catch (Exception e) { 21. e.printStackTrace(); 22. return null; 23. } 24. } 25. 26. /** 27. * 解密 28. * @param encryptedBytes 29. * @param aesKey 30. * @return 31. */ 32. public static byte[] decryptMessage(byte[] encryptedBytes, String aesKey) { 33. try { 34. Object obj = KeyUtil.getKey(aesKey); 35. SecretKey key = (SecretKey) obj; 36. Cipher cipher = Cipher.getInstance("AES"); 37. cipher.init(Cipher.DECRYPT_MODE, key); 38. byte[] bytes = cipher.doFinal(encryptedBytes); 39. return bytes; 40. } catch (Exception e) { 41. e.printStackTrace(); 42. return null; 43. } 44. } 45.}
RSAEncryptionUtil的encryptWithPublicKey()方法对信息进行加
密,decryptWithPrivateKey()方法对加密后的信息进行解密,分别需要传入公有和私有密钥。
由于提供的算法是对byte[]数组进行加密和解密返回新的byte[],因此我们需要提供一个普通object对象到byte[]之间转化的工具:且看SerializationUtil.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public class SerializationUtil { 6. 7. public static byte[] serialize(Object obj) { 8. try { 9. if (obj == null) 10. throw new NullPointerException(); 11. 12. ByteArrayOutputStream os = new ByteArrayOutputStream(); 13. ObjectOutputStream out = new ObjectOutputStream(os); 14. out.writeObject(obj); 15. out.flush(); 16. out.close(); 17. return os.toByteArray(); 18. } catch (Exception e) { 19. e.printStackTrace(); 20. return null; 21. } 22. } 23. 24. public static Object deserialize(byte[] by) { 25. try { 26. if (by == null) 27. throw new NullPointerException(); 28. 29. ByteArrayInputStream is = new ByteArrayInputStream(by); 30. ObjectInputStream in = new ObjectInputStream(is); 31. Object obj = in.readObject(); 32. in.close(); 33. return obj; 34. } catch (Exception e) { 35. e.printStackTrace(); 36. return null; 37. } 38. } 39.}
SerializationUtil类中的serialize()方法将普通java对象序列化成byte[],deserialize()方法将byte[]反序列化成原来的对象。
RSA加密算法有个特点,就是对加密明文和密文的长度有限制,当我们加密的明文过长时,我们需要对明文分块进行加密,因此那种长度较短的信息进行加密适合使用RSA算法。一般来说,我们进行加密的对象序列化成byte[]数组之后长度都超过了RSA加密算法的要求,因此我们可以选用另一种加密算法:AES。
二、 对称密钥加密算法AES
对称密钥算法中,信息的加密和解密都是使用相同的密钥,使用起来简单,速度快,但在使用之前,需要通过额外安全的途径交换加密密钥。首先,提供AES密钥生成算法,生成密钥保存在文件中,且看AESKeyCreater.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public class AESKeyCreater { 6. 7. /** 8. * @param args 9. */ 10. public static void main(String[] args) throws Exception{ 11. String url = System.getProperty("user.dir"); 12. AESKeyCreater aESKeyCreater = new AESKeyCreater(); 13. aESKeyCreater.createKeyFile(url); 14. } 15. 16. public void createKeyFile(String url) throws Exception{ 17. Security.addProvider(new SunJCE()); 18. KeyGenerator keygen = KeyGenerator.getInstance("AES"); 19. SecretKey key = keygen.generateKey(); 20. File file = new File(url + "/src/main/resources/AES_Secret_Key_File.aes"); 21. FileOutputStream out = new FileOutputStream(file); 22. ObjectOutputStream objectOutput = new ObjectOutputStream(out); 23. objectOutput.writeObject(key); 24. objectOutput.flush(); 25. objectOutput.close(); 26. } 27.}
AESKeyCreater类中createKeyFile()方法生成AES算法的密钥,保存在AES_Secret_Key_File.aes文件中,供加密和解密时使用。
其次,提供加密解密算法,对byte[] 进行加密和解密:且看AESEncryptionUtil.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public class AESEncryptionUtil { 6. /** 7. * 加密 8. * @param bytes 9. * @param aesKey 10. * @return 11. */ 12. public static byte[] encryptMessage(byte[] bytes, String aesKey) { 13. try { 14. Object obj = KeyUtil.getKey(aesKey); 15. SecretKey key = (SecretKey) obj; 16. Cipher cipher = Cipher.getInstance("AES"); 17. cipher.init(Cipher.ENCRYPT_MODE, key); 18. byte[] decryptedBytes = cipher.doFinal(bytes); 19. return decryptedBytes; 20. } catch (Exception e) { 21. e.printStackTrace(); 22. return null; 23. } 24. } 25. 26. /** 27. * 解密 28. * @param encryptedBytes 29. * @param aesKey 30. * @return 31. */ 32. public static byte[] decryptMessage(byte[] encryptedBytes, String aesKey) { 33. try { 34. Object obj = KeyUtil.getKey(aesKey); 35. SecretKey key = (SecretKey) obj; 36. Cipher cipher = Cipher.getInstance("AES"); 37. cipher.init(Cipher.DECRYPT_MODE, key); 38. byte[] bytes = cipher.doFinal(encryptedBytes); 39. return bytes; 40. } catch (Exception e) { 41. e.printStackTrace(); 42. return null; 43. } 44. } 45.}
AESEncryptionUtil类中encryptMessage()方法对信息进行加密,decryptMessage()方法对信息进行解密,都需要传入AES密钥文件。由于都是对byte[]数组进行加密和解密,因此也需要RSA算法中提供的普通Object对象和byte[]之间的映射工具。
下面给出AES算法对hessian进行加密和解密传输,思路:客户端通过Hessian工厂获取到Hessian服务之后,将传入参数对象序列化成byte[],然后对byte[]进行加密,然后调用hessian服务的方法,服务端获取到客户端传过来的加密之后的byte[]参数,首先进行AES解密,然后将byte[]反序列化成参数对象,再调用相应的业务逻辑,再然后将返回结果进行序列化成byte[],然后进行AES加密,然后客户端获得返回结果之后进行AES解密,然后反序列化成结果对象,至此一轮调用完成。且看hessian服务接口:EncryptionService.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public interface EncryptionService { 6. 7. public static final String publicKeyFile = EncryptionService.class.getResource("/").getPath() + "/public_key_file.rsa"; 8. public static final String privateKeyFile = EncryptionService.class.getResource("/").getPath() + "/private_key_file.rsa"; 9. public static final String aesKeyFile = EncryptionService.class.getResource("/").getPath() + "AES_Secret_Key_File.aes"; 10. 11. public byte[] testHessianEncrypt(byte[] encryptedBytes); 12. 13.}
由于hessian是一个二进制协议,非常适合传输二进制数据,以byte[]作为参数和返回结果是非常合适的,将来这部分完全可以做在框架之中。且看hessian服务实现类:EncryptionServiceImpl.java
1./** 2. * @author zhangwei 3. * 4. */ 5.public class EncryptionServiceImpl implements EncryptionService{ 6. 7. public byte[] testHessianEncrypt(byte[] encryptedBytes) { 8. //解密参数 9. byte[] decryptedBytes = AESEncryptionUtil.decryptMessage(encryptedBytes, aesKeyFile); 10. //将参数反序列化 11. Secret secret = (Secret)SerializationUtil.deserialize(decryptedBytes); 12. //业务逻辑 13. System.out.println(secret.getMessage()); 14. secret.setMessage("I love you too!"); 15. System.out.println(secret.getMessage()); 16. //将结果序列化 17. byte[] returnBytes = SerializationUtil.serialize(secret); 18. //加密返回结果 19. byte[] encryptedReturnBytes = AESEncryptionUtil.encryptMessage(returnBytes,aesKeyFile); 20. return encryptedReturnBytes; 21. } 22.}
代码一目了然,没啥好说的。且看客户端调用:TestClient.java
1./**
2. * @author zhangwei
3. *
4. */
5.public class TestClient {
6. 7. /** 8. * @param args 9. * @throws MalformedURLException 10. */ 11. public static void main(String[] args) throws MalformedURLException { 12. String hessianServiceUrl = "http://localhost:8089/HessianEncryption/hessianService"; 13. String aesKeyFile = System.getProperty("user.dir") + "/lib/AES_Secret_Key_File.aes"; 14. 15. HessianProxyFactory factory = new HessianProxyFactory(); 16. EncryptionService service = (EncryptionService)factory.create(EncryptionService.class, hessianServiceUrl); 17. Secret secret = new Secret(); 18. secret.setMessage("I love you!"); 19. System.out.println(secret.getMessage()); 20. //序列化參數 21. byte[] paramBytes = SerializationUtil.serialize(secret); 22. //加密參數 23. byte[] encryptedParamBytes = AESEncryptionUtil.encryptMessage(paramBytes, aesKeyFile); 24. //調用方法 25. byte[] encryptedReturnBytes = service.testHessianEncrypt(encryptedParamBytes); 26. //解密返回結果 27. byte[] decryptedReturnBytes = AESEncryptionUtil.decryptMessage(encryptedReturnBytes, aesKeyFile); 28. //反序列化結果 29. Secret returnResult = (Secret)SerializationUtil.deserialize(decryptedReturnBytes); 30. System.out.println(returnResult.getMessage()); 31. } 32. 33.}
【转载地址】http://zwustudy.iteye.com/blog/1679850
相关推荐
例如,安全性的强化可能是一个重点,如加密传输以保护数据安全;也可能提供了更好的错误处理机制,使开发者更容易调试问题。此外,Hessian4.0.7可能支持更多的编程语言,如Python、Ruby等,扩大了Hessian的适用范围...
- 为了安全,可以考虑对传输的数据进行加密,或者启用HTTPS。 总结来说,"dubbo-hessian协议http请求demo"这个示例主要展示了如何在Java环境中利用Dubbo的Hessian协议进行服务间的HTTP通信。通过理解Hessian协议的...
- 考虑安全性问题,Hessian默认不加密传输,可以通过HTTPS或自定义Filter增强安全性。 通过上述配置,我们可以实现Spring中基于Hessian的RPC通信,使得服务间的调用变得高效且简单。`HelloHessianService`和`...
4. **序列化**:由于Hessian是基于二进制的,因此传输的对象需要实现`Serializable`接口,以确保它们能被正确序列化和反序列化。 5. **客户端调用**:客户端通过生成服务接口的代理对象来调用服务端的方法,这些...
- 对于敏感数据,可以使用HTTPS进行加密传输,以保护数据的安全。 - 另外,可以通过缓存代理对象和批量处理请求等方式进一步优化性能。 5. **错误处理**: - 在客户端和服务端,都需要处理可能出现的异常,如...
在安全方面,Hessian可以通过HTTPS与SSL/TLS进行加密,确保数据传输的安全性。不过,需要注意的是,Hessian本身并不提供身份验证和授权机制,这些通常需要在更高层的应用或网络基础设施中实现。 在实际应用中,...
此外,对于敏感数据的文件,还需要加密存储和传输。 8. **异常处理**:在服务端,需要对可能出现的异常进行捕获和处理,如网络中断、文件不存在、磁盘空间不足等,以提供友好的错误信息给客户端。 9. **性能监控**...
此外,数据传输应加密以防止中间人攻击,可以结合HTTPS协议来实现。 6. **异常处理**: Hessian服务端和客户端之间的异常处理也很重要。当服务端出现异常时,Hessian会将异常信息序列化并返回给客户端,客户端可以...
2. **数据加密**:传输的数据如果不进行加密,可能会被截获,因此在敏感数据传输时应启用SSL/TLS。 3. **版本控制**:随着服务的升级,可能需要支持旧版本的接口,版本控制可以帮助解决兼容性问题。 总结,Hessian...
4. 安全性:虽然Hessian本身并不直接提供安全性,但可以通过在HTTP层添加SSL/TLS来加密通信,确保数据的安全传输。 在实际应用中,使用Hessian的步骤通常如下: 1. 在服务器端创建一个服务接口,并实现该接口。 2. ...
Hessian提供了序列化和反序列化的机制,使得对象可以被编码为字节流,并在网络间传输,然后在接收端解码回原生的对象形式。 在“hessian简单实例”中,我们有两个关键部分:`hessian-server`和`hessian-client`。`...
因此,对于敏感数据,应确保在传输过程中进行加密。 2. 兼容性:尽管Hessian有多个版本,但不同版本之间可能存在不兼容的情况。使用时需确保服务端和客户端使用相同版本的库。 3. 错误处理:Hessian在处理异常时,...
7. **安全考虑**:在实际应用中,我们需要对Hessian服务进行安全控制,如添加身份验证、授权和加密机制。Spring Security可以与Hessian整合,提供安全的远程服务访问。 8. **测试与监控**:为了确保服务的稳定性和...
1. **Hessian协议**:Hessian由Caucho公司开发,它的主要优点是数据传输紧凑、高效,同时能够处理各种复杂的对象类型,包括Java和.NET的对象。它采用了二进制格式,相比XML-RPC或JSON-RPC,能更节省网络带宽,提高...
1. **协议特性**:Hessian是一种紧凑、高效的二进制协议,相比HTTP或XML-RPC,它在数据传输上更节省带宽,因为其序列化和反序列化机制是针对二进制格式优化的。这在移动设备网络资源有限的情况下尤其重要。 2. **...
- **安全性考虑**:在使用Hessian时,如何添加认证和加密以保障通信安全。 总之,深入研究Hessian源代码不仅可以帮助我们优化远程服务的性能,还能提升我们在分布式系统和网络通信领域的专业技能。通过实践和调试,...
在实际应用中,应确保Hessian通信的安全性,例如使用HTTPS协议加密通信,以及对服务调用进行身份验证和权限控制。 总之,Android应用通过Hessian与Web服务器通讯能实现高效的远程调用,降低了网络通信的开销。但...
因此,服务端应配置相应的安全措施,如SSL加密、防火墙规则等。此外,还可以通过缓存、连接池等手段优化性能。 6. **监控与日志**: 在生产环境中,对Hessian服务的监控和日志记录至关重要。可以使用Spring的AOP...
在实际部署中,应考虑使用HTTPS等安全协议进行加密,防止数据在传输过程中被截获。 6. **错误处理**:了解Hessian如何处理调用异常和网络故障是重要的实践技能。当出现错误时,Hessian会尝试捕获并序列化异常,以便...