当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java-从配置文件加密/解密用户名和密码》经验,为你挑选了2个好方法。

我们正忙着为客户开发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上运行是有利的,因为您可以在服务器上使用自签名证书.

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



1> Gennady Shum..:

据我所知,为了调用第三方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方法之间的问题:"什么也不做"和其他问题:"有一种价值可以做甚至最小的事情".
任何能够访问该文件的人都可以访问您的代码并对其进行反编译(或者只是使用它)来获取密钥.微软尝试了类似的东西保护SAM,它几乎立即被打破.

2> erickson..:

在内联网上当然不能解雇安全.对信息造成的损害最大的是内部人员.查看受保护的内容的价值,并充分考虑安全性.

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

请勿将第三方密码分发到Web服务器之外.

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

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

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

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

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

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有