我正在编写一个连接到服务器并读取给定队列中的消息的Java类。
我想保护用户名和密码,现在,它在源代码中显示为纯文本。
我想知道的是,有什么好办法呢?如果我在文本文件中加密用户名和密码,我是否需要在访问此文件的任何源代码中以 纯文本 存储密钥?然后决定使用我的班级的任何其他人都可以访问这些领域。
没有人可以输入密钥的提示,因为系统会自动使用此类。
编辑:这将成为一个java lib文件。但那些很容易被反编译,因此基本上都是原始的类文件,对吧?而受到保护的人是其他系统的开发人员,他们将获得对此lib文件的访问权。
我的最终目标:是让用户名和密码字符串 不 在任何地方显示为纯文字,并且让它们变得困难尽可能破解。
答案 0 :(得分:5)
不可能这样做。即使您加密登录名/密码并将其存储在某处(可能是您的类或外部文件),您仍然需要以纯文本格式保存加密密钥。这实际上比在纯文本中保存用户名/密码要好一些,实际上我会避免这样做,因为它会产生错误的安全感。
所以我建议您的类将用户名/密码作为参数,并且使用您的类的系统必须关心保护凭据。它可以通过要求最终用户输入凭据或将它们存储到外部文件中来实现,该外部文件只对您的进程正在运行的操作系统用户可读。
编辑:您可能还会考虑使用OAuth等使用令牌而不是密码的机制。令牌具有有限的使用寿命并且与特定目的相关联,因此它们是访问凭证的良好替代方案。因此,您的最终用户可以使用他们的Windows凭据获取访问令牌,然后在您的类中使用该凭据来调用受保护的服务。
答案 1 :(得分:1)
这是一个classic authentication问题,除了在这里,Eve可以像穿西装一样穿上Bob的皮肤。这是否比较紧张? 我不确定。
简短的回答是没有真正的答案,因为你想要的是基本上违反信息理论的东西,因为任何可传输的都是可复制的,因此任何可访问的东西都可以被视为不再是唯一的。即使你有一个魔术盒,他们也可以用一些严重的JVM黑客攻击魔术盒。
答案很长,有一些解决方案几乎相当不错,因为它真的很难。我建议你阅读链接的文章,熟悉SRP背后的想法,规范带来的漏洞,并试图弄清楚如何获得使用和实现它的权利。问题仍然存在。这就是你想要一个系统,确保鲍勃永远不会变成肉车,或者陷入黑暗的一面。
从根本上说,你打破了 tenth law。我同意Kork的观点,没有任何解决方案可以真正做到你想要的,因为你正试图通过技术专长来解决社会问题,这几乎是不可能的。
答案 2 :(得分:0)
有几种方法可以解决这个问题。您已经注意到的挑战是将帐户与此自动流程相关联。所以,这里有一些可能性(从最不安全到更安全):
重要的是要注意,您的安全措施应该比限制破解更具限制性。简而言之,如果所有潜在的坏人只能获得当天的食物偏好,那么你可能不需要像保护银行账户这样更高调的东西一样保持警惕。用户名和密码不是唯一的身份验证方式。
答案 3 :(得分:0)
目前尚不清楚哪些代码必须知道用户名&密码。这些凭据是否仅用于正在读取的队列?如果是这样,只有服务器代码需要知道它们。在这种情况下,您可以将它们存储在服务器文件中,该文件的权限仅允许服务器代码读取它们。然后,服务器操作系统将强制执行文件权限,这种安全性比大多数程序员的安全性要好得多。
答案 4 :(得分:0)
我知道这个问题早已被遗弃,但我想指出,当然你可以通过在运行时要求输入凭证但只存储密码的哈希来做到这一点。当然,它需要是一个非常好的哈希。使用标准的,不要自己组成。散列的重点在于,即使您对散列结果进行纯文本处理,也没有其他人能够提出产生该散列的字符串,即使他们知道如何计算散列。
当然,用户可以尝试强力攻击,因为他们知道他们想要的结果,所以他们可以快速运行,所以你需要使用高度安全的密码。