我正在构建一个与Web服务交互的应用程序。为了使用该Web服务,我必须使用我的实际用户名和密码登录 - 没有其他方法可以使用该服务。
我不想在我的细节中硬编码,如下:
String username = "MyUsername";
String password = "MyPassword";
我考虑过加密细节并将它们存储在一个文件中,但即便如此,任何有一些编程经验的人都可以通过查看我的源代码轻松恢复信息:
File f = load("mydetails.txt");
String[] = recoverDetails(f); //or something like that
我最安全地保存这些信息的方式是什么?
答案 0 :(得分:3)
如果确实希望它们安全,那么您将不得不将它们锁定在加密安全的“保险库”文件中。有人 - 你或某人信任,但这在这里是合适的 - 将提供解锁保险库的密钥(基本上是另一个密码),然后你的软件将能够访问存储在其中的信息。
如果没有人在启动应用程序时涉及到秘密,那么实际上根本无法完全隐藏信息。这只是一个现实的简单事实,很多人(比如DVD财团)都在努力否认自己的危险。
答案 1 :(得分:2)
将其存储在文件中,但将文件设置为只读,并且只能由服务进程读取。
如果您想放弃您的应用程序,则无法以无法恢复登录信息的方式保护您的应用程序。遗憾。
通常,这是通过提供服务器端安全性以及为您的公共API的每个用户提供自己的凭据来处理的。它就像谷歌地图,你必须获得一个特殊的密钥并使用它来使用API,因此谷歌可以追踪你是否以合法的方式使用API。
答案 2 :(得分:1)
您没有提到代码的部署位置。如果您的应用程序在客户的计算机上运行并直接发出Web服务请求,则无法阻止某人获取凭据。即使您加密了它们,应用程序也必须能够使它们可用,因此解密密钥必须可用,因此对您的用户来说。即使你可以安全地加密它,用户还有其他方法,因为它是他们的盒子,例如嗅探出站网络流量。
如果进行Web服务调用的代码在您的服务器上,那么您遇到了同样的问题,但至少控制了环境。在某些时候,服务器必须将加密的凭证呈现为可用的形式以发出Web服务请求,因此您可以加密Web服务凭证,但密码或证书必须可供代码访问它们。除非每次都有人为证书输入密码短语,否则所有这些都是嵌套凭证,但不保护它们。
当然,答案是不要试图解决代码中不安全的Web服务要求的问题。找到可以调用的更安全的等效Web服务(可能是使用API密钥和用户自己的凭据或生成安全令牌的Web服务),或者游说Web服务提供商以正确的方式执行此操作。看看Twitter和Facebook上最近的安全性进展 - 用户需求可以带来改变。
答案 3 :(得分:0)
因为你建议人们能够看到你的代码,我猜他们也能够在他们的硬件上运行软件(意味着他们有root,任何只读限制都会失败,最终)。
我能想到的唯一安全方法如下:
这样,使用您的凭据的唯一方法是使用私钥解密它们,私钥在您的卡上以只读方式存储,并使用其他密码(PIN码)访问。
正如Pointy所提到的,如果没有人为因素保密(私钥的PIN码和智能卡的物理所有权),就无法100%保证信息安全。
答案 4 :(得分:0)
您应该使用散列函数,并且不应将数据库密码存储为纯文本,而应存储为散列值。然后你只向数据库提供哈希值,因为它还有一个哈希值,你没有什么可担心的。
但是,如果您必须在程序中使用明文,那么带有调试器的攻击者可以在您将其提供给数据库时找到用户名和密码的值。更重要的是,外部攻击者可以使用嗅探工具(例如wireshark)观察您的网络,如果您使用不安全的网络协议,则只需获取值。因此,在程序流程中,根本不建议使用任何明文用户名密码对。
如果你必须这样做,无论如何,最好和最安全的方法是加密你的用户名/密码对,当它们被发送到服务器的时候你应该解密它们并以服务器赢得的明文形式发送它们不了解加密。但是,如果你有任何访问服务器的权限,也许你应该稍微修改一下它,因此它不会将密码存储为纯文本。
干杯。
答案 5 :(得分:0)
正如其他人所指出的那样,没有神奇的方法来掩盖你的密码(这是一种逻辑上的不可能性,参见DVD复制保护),但你应该采取一些安全预防措施来尽量减少潜在的损害。
如果您不控制服务器(例如,您在共享主机上运行您的应用程序),则:
如果您确实控制了服务器,那么<em>另外: