我们正忙着为客户开发Java Web服务。有两种可能的选择:
将加密的用户名/密码存储在Web服务客户端上。从配置中读取。客户端文件,解密并发送。
将加密的用户名/密码存储在Web服务器上。从配置中读取。 Web服务器上的文件,在Web服务中解密和使用。
Web服务使用用户名/密码来访问第三方应用程序。
客户端已经有提供此功能的类,但这种方法涉及以明文形式发送用户名/密码(尽管在Intranet中)。他们更喜欢存储信息。在网络服务中,但并不真的想要支付他们已有的东西。 (安全性不是一个重要的考虑因素,因为它只在其内部网中)。
因此,我们需要快速简便的Java。
有什么建议吗?
服务器是Tomkat 5.5。 Web服务是Axis2。
答案 0 :(得分:25)
据我所知,为了调用第三方Web服务,您将密码作为纯文本传递,并且不涉及安全证书。
然后我会说最简单的方法是在加密/解密密钥刚刚在代码中进行硬编码时以加密格式存储密码(通过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));
答案 1 :(得分:18)
在内联网上肯定不能解雇安全问题。对信息造成的损害最大的是内部人员。查看受保护的内容的价值,并充分考虑安全性。
听起来有一个第三方应用程序,您有一组凭据,以及一些在使用第三方应用程序时有效共享此身份的客户端。如果是这种情况,我建议采用以下方法。
请勿在您的网络服务器之外分发第三方密码。
最安全的方法是以交互方式将其提供给Web应用程序。这可能是ServletContextListener,它在应用程序启动时提示输入密码,或者是应用程序中的页面,以便管理员可以通过表单输入密码。密码存储在ServletContext中,用于验证对第三方服务的请求。
安全性降低是将密码存储在服务器的文件系统中,以便只有运行服务器的用户才能读取。这取决于服务器的文件系统权限以进行保护。
尝试在客户端或服务器上存储加密形式的密码只是向后退一步。当你试图用另一个秘密来保护秘密时,你会陷入无限的倒退。
此外,客户端应该向服务器验证自己。如果客户端是交互式的,请让用户输入密码。然后,服务器可以决定该用户是否有权访问第三方服务。如果客户端不是交互式的,那么下一个最好的安全性是使用文件系统权限来保护客户端的密码。
要保护客户端的凭据,应使用SSL保护客户端和Web服务器之间的通道。在此,在Intranet上运行是有利的,因为您可以在服务器上使用自签名证书。
如果您将密码存储在文件中,请将它们自己放入文件中;它使得管理权限的需求更加显着,并且最大限度地减少了许多用户编辑该文件并因此查看密码的需要。