我们正忙着为客户开发Java Web服务.有两种可能的选择:
将加密的用户名/密码存储在Web服务客户端上.从配置中读取.在客户端文件,解密和发送.
将加密的用户名/密码存储在Web服务器上.从配置中读取.Web服务器上的文件,解密并在Web服务中使用.
Web服务使用用户名/密码来访问第三方应用程序.
客户端已经有提供此功能的类,但这种方法涉及以明文形式发送用户名/密码(尽管在Intranet内).他们更喜欢存储信息.在网络服务中,但并不真的想要支付他们已有的东西.(安全性不是一个重要的考虑因素,因为它只在其内部网中).
所以我们需要快速简便的Java.
有什么建议?
服务器是Tomkat 5.5.Web服务是Axis2.
我们应该使用什么加密/解密包?
关键商店怎么样?
我们应该使用什么配置机制?
这很容易部署吗?
Gennady Shum.. 26
据我所知,为了调用第三方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));
@frankodwyer你是对的,但我的答案(以及问题本身)并没有假装提供完全安全的解决方案,而是提供一定程度的安全性.所以对我来说,这更像是@ericson方法之间的问题:"什么也不做"和其他问题:"有一种价值可以做甚至最小的事情". (5认同)
任何能够访问该文件的人都可以访问您的代码并对其进行反编译(或者只是使用它)来获取密钥.微软尝试了类似的东西保护SAM,它几乎立即被打破. (3认同)
erickson.. 18
在内联网上当然不能解雇安全.对信息造成的损害最大的是内部人员.查看受保护的内容的价值,并充分考虑安全性.
这听起来像是第三方应用程序,您有一组凭据,以及一些在使用第三方应用程序时有效共享此身份的客户端.如果是这种情况,我建议采用以下方法.
请勿将第三方密码分发到Web服务器之外.
最安全的方法是以交互方式将其提供给Web应用程序.这可能是ServletContextListener,它在应用程序启动时提示输入密码,或者是应用程序中的页面,以便管理员可以通过表单输入密码.密码存储在ServletContext中,用于验证对第三方服务的请求.
安全性降低是将密码存储在服务器的文件系统中,以便只有运行服务器的用户才能读取密码.这取决于服务器的文件系统权限以进行保护.
尝试在客户端或服务器上存储加密形式的密码只是向后退一步.当你试图用另一个秘密来保护秘密时,你会陷入无限的倒退.
此外,客户端应该向服务器验证自己.如果客户端是交互式的,请让用户输入密码.然后,服务器可以决定该用户是否有权访问第三方服务.如果客户端不是交互式的,则下一个最佳安全性是使用文件系统权限来保护客户端的密码.
为保护客户端的凭据,客户端和Web服务器之间的通道应使用SSL进行保护.在此,在Intranet上运行是有利的,因为您可以在服务器上使用自签名证书.
如果您将密码存储在文件中,请将它们自己放入文件中; 它使得管理权限的需求更加显着,并且最大限度地减少了许多用户编辑该文件并因此查看密码的需要.
据我所知,为了调用第三方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));
在内联网上当然不能解雇安全.对信息造成的损害最大的是内部人员.查看受保护的内容的价值,并充分考虑安全性.
这听起来像是第三方应用程序,您有一组凭据,以及一些在使用第三方应用程序时有效共享此身份的客户端.如果是这种情况,我建议采用以下方法.
请勿将第三方密码分发到Web服务器之外.
最安全的方法是以交互方式将其提供给Web应用程序.这可能是ServletContextListener,它在应用程序启动时提示输入密码,或者是应用程序中的页面,以便管理员可以通过表单输入密码.密码存储在ServletContext中,用于验证对第三方服务的请求.
安全性降低是将密码存储在服务器的文件系统中,以便只有运行服务器的用户才能读取密码.这取决于服务器的文件系统权限以进行保护.
尝试在客户端或服务器上存储加密形式的密码只是向后退一步.当你试图用另一个秘密来保护秘密时,你会陷入无限的倒退.
此外,客户端应该向服务器验证自己.如果客户端是交互式的,请让用户输入密码.然后,服务器可以决定该用户是否有权访问第三方服务.如果客户端不是交互式的,则下一个最佳安全性是使用文件系统权限来保护客户端的密码.
为保护客户端的凭据,客户端和Web服务器之间的通道应使用SSL进行保护.在此,在Intranet上运行是有利的,因为您可以在服务器上使用自签名证书.
如果您将密码存储在文件中,请将它们自己放入文件中; 它使得管理权限的需求更加显着,并且最大限度地减少了许多用户编辑该文件并因此查看密码的需要.