Java-加密/解密配置文件中的用户名和密码

Java-加密/解密配置文件中的用户名和密码,java,encryption,configuration-files,Java,Encryption,Configuration Files,我们正忙于为客户端开发JavaWeb服务。有两种可能的选择: 在web服务客户端上存储加密的用户名/密码。从配置中读取。文件在客户端,解密并发送 在web服务器上存储加密的用户名/密码。从配置中读取。文件,解密并在web服务中使用 web服务使用用户名/密码访问第三方应用程序 客户端已经有提供此功能的类,但这种方法需要在clear中发送用户名/密码(尽管是在intranet中)。他们更喜欢存储信息。在web服务中,但不想为他们已经拥有的东西付费。(安全不是一个大问题,因为它只在他们的内部网中

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

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

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

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

客户端已经有提供此功能的类,但这种方法需要在clear中发送用户名/密码(尽管是在intranet中)。他们更喜欢存储信息。在web服务中,但不想为他们已经拥有的东西付费。(安全不是一个大问题,因为它只在他们的内部网中)

所以我们需要一些用Java快速简单的东西

有什么建议吗

服务器是Tomkat5.5。web服务是Axis2

  • 我们应该使用什么加密/解密包
  • 钥匙店怎么样
  • 我们应该使用什么配置机制
  • 这是否易于部署

    • 在内部网上当然不能证明放弃安全性是正当的。对信息造成的大部分损害都是由内部人员造成的。看看被保护的东西的价值,并适当考虑安全性

      听起来好像有一个第三方应用程序,您有一组凭据,一些客户端在使用第三方应用程序时有效地共享此身份。如果是这样,我建议采用以下方法

      不要将第三方密码分发到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));
      

      “你的密匙短语”来自哪里?如果这个源代码是安全的,为什么不使用它来保存实际的密码呢?正如我提到的,这个密钥是在java类中硬编码的,或者它可以存储在数据库中。使用密码本身需要在每次更改密码时重新编译代码。任何能够访问该文件的人也可以访问您的代码并对其进行反编译(或直接使用)以获取密钥。Microsoft尝试了类似的方法来保护SAM,但它几乎立即被破坏。@frankodwyer您是对的,但我的回答(以及问题本身)并没有假装提供完全安全的解决方案,而是提供某种程度的安全性。所以对我来说,这更像是@ericson方法中的一个问题:“什么都不做”和另一个问题:“做一些即使是最小的事情也有价值”。这是一个问题!如果您将“您的密钥短语”更改为“您的密钥短语Eek434jlh72eee”,您仍然可以正确解密。错。