我必须说,我知道,硬编码在客户端应用程序密码是不好的做法,原因是多方面的,以前言这个问题。 有处理这个问题的其他问题。 这个问题的范围较窄,并且假定认证证书必须驻留在客户端应用程序的一些集合,是你无法控制的原因代码。
如果某些方面是比其他人(例如:JPasswordField中存储在字符数组,而不是一个字符串密码),如果你不得不硬编码在Java应用程序,你可以采取什么措施来使其难以被取出?
更新:
该应用程序的一个实例上的远程PC中,最终用户具有管理员权限运行。 该凭证用于在同一网络中访问一个数据库,因此实际的密码已被预先确定的,并且必须在实际的代码手工输入。
....如果你有它硬编码在Java应用程序中,你能采取什么措施来使其更难被取出?
一开始,我会做该死的肯定与作出这种糟糕的决策管理责任人充分意识到,这是从根本上和无可救药的不安全 1。
然后,我可能会想出一些蹩脚的算法,组装在一个不起眼的方式,密码; 例如,通过建立两个字节数组和异或在一起...和分发混淆字节码。 你可以希望做到最好是难以用有限的技能乡亲反向工程从你的代码的密码。
(加密具有较强的算法的密码不会有太大的帮助,因为算法的选择和解密密钥都必须嵌入在你的代码。事实上,你可以梦想的任何方案可以通过使用调试器来设置一个被打败断点,其中的密码必须是在清澈的地步。)
1 ...而且即使乔恩斯基特将无法使其安全。
如果某些方面比别人强(例如:JPasswordField中存储在字符数组,而不是一个字符串密码)...
我只是想指出,使用一个字符数组持有JPasswordField中的密码之类的正常推理,以防止坏人读出密码的核心转储或交换文件。 它不会在这种情况下,真正的帮助,因为我们必须假设,坏家伙,你应该担心的是西蒙尼与系统管理员权限。 他或她将有足够的控制,以一个调试器附加到JVM和捕获从字符数组的字节数。
作为一般原则,你不应该存储密码(当然)。
如果你需要在运行时提供一个密码的最佳实践(由Jez的谦逊例如在连续型交货书主张)是提供在部署/启动时的密码。 这样一来,密码可以仅存在于人们的头上,而不是在一个不安全的文件的某处。
我不知道这是不是你的情况是可行的,但你应该对旨在。
我猜至少非理想的解决方案是,如果你能在它随机元素基于询问的认证协议。
这样,它不只是密码,它也是使用该密码生成正确的反应,这需要进行逆向工程的代码。
然后,它也可以是双向的身份验证,这是你最终能确认对方也使用相同的协议/算法,也有相同的密码。
而最重要的,则密码永远不会通过网络发送的,所以它不能被嗤之以鼻。
的Diffie-Helman密钥交换是这样的事情一个广泛的协议,但你总是可以推出自己的简单的实现,如果你只想默默无闻,而不是真正的安全。 那么,真正的安全显然是遥不可及的,如果一切可以反编译,并从字节码反向工程,但无论如何... :)
这是非常不安全的存储在客户端的敏感数据,espicially密码,因为.class文件可以很容易地反编译。 你有没有想过得到一些非对称加密的东西参与? 像公/私钥对或类似的东西?
我喜欢斯蒂芬的答案,但我想补充...
源代码的安全性也很重要。 不管你用什么方法来混淆密码,任何人都可以访问来源可以很容易地把一个System.out.println(password)
,并捕获使用它的密码,或在调试的代码和停止代码检查变量。
即使没有编制,任何人进入jar
可以开始在调试模式下的Java程序,并停止在使用密码程序和检查变量,琐碎的源代码,但还是可行的只有罐子和一些工具。
你可能会考虑让程序从一个安全的服务器获取密码的时候才需要它(通过Web服务调用或其他),并有服务器使用防火墙允许访问它(如果该客户机的IP是只有特定的IP地址已知的)。 它仍然是不安全的,但至少它的东西。
您可以哈希密码,如果你愿意,甚至对其进行加密。 看看这个帖子就可能出现有益的。 爪哇-加密/从配置文件解密的用户名和密码
文章来源: What's the most secure way to embed a password inside Java code? [duplicate]