2008-12-03 159 views
13

我们正在为客户端开发Java Web服务。有两种可能的选择:Java - 从配置文件加密/解密用户名和密码

  • 将加密的用户名/密码存储在Web服务客户端上。从配置中读取。文件在客户端,解密并发送。

  • 将加密的用户名/密码存储在Web服务器上。从配置中读取。文件在Web服务器上解密并在Web服务中使用。

Web服务使用用户名/密码访问第三方应用程序。

客户端已经具有提供此功能的类,但此方法涉及以明文方式发送用户名/密码(尽管在Intranet内)。他们更喜欢存储信息。在网络服务中,但并不真正想要支付他们已有的东西。 (安全性不是一个重要的考虑因素,因为它只在其内部网中)。

所以我们需要Java中的一些简单快捷的东西。

有什么建议吗?

服务器是Tomkat 5.5。 Web服务是Axis2。

  • 我们应该使用什么加密/解密软件包?
  • 关键商店呢?
  • 我们应该使用什么配置机制?
  • 这会很容易部署吗?

回答

18

正在内联网当然没有理由解雇安全。对信息造成的大部分损害是由内部人士承担。看看被保护的东西的价值,并充分考虑安全性。

听起来好像有一个第三方应用程序,您拥有一组凭据,以及一些客户端在使用第三方应用程序时可以有效共享此标识。如果是这种情况,我建议采用以下方法。

不要在您的Web服务器之外分发第三方密码。

要做到这一点最安全的方法是以交互方式将其提供给Web应用程序。这可能是ServletContextListener,它会在应用程序启动时提示输入密码,或者在应用程序中提供一个页面,以便管理员可以通过表单输入密码。密码存储在ServletContext中,用于验证对第三方服务的请求。

降低安全性的方法是将密码存储在服务器的文件系统上,以便只有运行服务器的用户才能读取密码。这依赖于服务器的文件系统权限进行保护。

尝试在客户端或服务器上存储加密形式的密码,只是向后退一步。试图用另一个秘密保护秘密时,你陷入无限倒退。

另外,客户端应该向服务器验证自己。如果客户端是交互式的,请让用户输入密码。然后服务器可以决定该用户是否有权访问第三方服务。如果客户端不是交互式的,下一个最好的安全措施是使用文件系统权限来保护客户端的密码。

为了保护客户端的凭据,客户端和Web服务器之间的通道应该使用SSL进行保护。在这里,在Intranet上运行是有利的,因为您可以在服务器上使用自签名证书。

如果您将密码存储在文件中,请将它们自己放入文件中;它使得需要更仔细地管理权限,并且最大限度地减少了许多用户编辑该文件并因此看到密码的需要。

24

据我所知,为了打电话给第三方网络服务,您将密码作为纯文本传递,并且不涉及安全证书。

然后,我会说最简单的方法是以加密格式(通过java加密机制)存储密码,当加密/解密密钥只是硬编码在代码中。

我肯定会将它存储在服务器端(文件系统或数据库),而不是在多个客户端上分发和维护它。

这是怎么会与“DES”加密工作:

// only the first 8 Bytes of the constructor argument are used 
// as material for generating the keySpec 
DESKeySpec keySpec = new DESKeySpec("YourSecr".getBytes("UTF8")); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
SecretKey key = keyFactory.generateSecret(keySpec); 
sun.misc.BASE64Encoder base64encoder = new BASE64Encoder(); 
sun.misc.BASE64Decoder base64decoder = new BASE64Decoder(); 
......... 

// ENCODE plainTextPassword String 
byte[] cleartext = plainTextPassword.getBytes("UTF8");  

Cipher cipher = Cipher.getInstance("DES"); // cipher is not thread safe 
cipher.init(Cipher.ENCRYPT_MODE, key); 
String encrypedPwd = base64encoder.encode(cipher.doFinal(cleartext)); 
// now you can store it 
...... 

// DECODE encryptedPwd String 
byte[] encrypedPwdBytes = base64decoder.decodeBuffer(encryptedPwd); 

Cipher cipher = Cipher.getInstance("DES");// cipher is not thread safe 
cipher.init(Cipher.DECRYPT_MODE, key); 
byte[] plainTextPwdBytes = (cipher.doFinal(encrypedPwdBytes)); 
+0

哪里“你的密钥短语”从何而来?如果该来源是安全的,为什么不使用它来保存实际的密码? – erickson 2008-12-04 17:09:24