14

我们正忙于为客户开发 Java Web 服务。有两种可能的选择:

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

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

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

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

所以我们需要在 Java 中快速和简单的东西。

有什么建议吗?

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

  • 我们应该使用什么加密/解密包?
  • 钥匙店呢?
  • 我们应该使用什么配置机制?
  • 这很容易部署吗?
4

2 回答 2

26

据我了解,为了调用第 3 方网络服务,您将密码作为纯文本传递,并且不涉及安全证书。

然后我会说最简单的方法是以加密格式(通过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));
于 2008-12-04T07:09:44.600 回答
18

在 Intranet 上当然不能证明忽略安全性是正当的。对信息造成的大多数损害是由内部人员造成的。查看受保护内容的价值,并适当考虑安全性。

听起来有一个第三方应用程序,您有一组凭据,并且一些客户端在使用第三方应用程序时有效地共享此身份。如果是这种情况,我推荐以下方法。

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

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

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

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

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

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

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

于 2008-12-03T23:09:07.610 回答