2011-01-30 34 views
2

我正在构建与Web服务交互的应用程序。为了使用该Web服务,我必须使用我的实际用户名和密码登录 - 没有其他方式可以使用该服务。Java - 安全地存储在代码中使用所需的用户帐户详细信息

我不想硬编码在我的细节,像这样:

String username = "MyUsername"; 
String password = "MyPassword"; 

我曾经想过加密细节,并将它们存储在一个文件中,但是,即使如此,谁具有一定的编程经验可以通过查看我的源代码轻松恢复信息:

File f = load("mydetails.txt"); 
String[] = recoverDetails(f); //or something like that 

什么是最安全的方式来存储此信息?

+1

您的应用程序(使用Web服务的应用程序)是分发给用户的东西,还是您在自己的服务器上运行的Internet应用程序? – erickson 2011-01-30 20:05:12

回答

3

如果你真的希望他们安全,你将不得不将他们锁定到一个密码安全的“文件库”文件。某人—您或其他人信任,但这里适合—将提供一个解锁Vault(基本上是另一个密码)的钥匙,然后您的软件将能够访问存储在其中的信息。

如果没有人有秘密参与启动应用程序,那么真的没有办法完全隐藏信息。这只是现实的一个简单事实,很多人(如DVD联盟)都很难否认自己的危险。

2

将其存储在文件中,但使该文件为只读,并且只能由服务进程读取。

如果您想将您的应用程序移走,则无法以无法恢复登录信息的方式对其进行保护。抱歉。

通常这是通过提供服务器端安全性,并通过为您的公共API的每个用户提供自己的凭据来处理的。这就像谷歌地图,你必须得到一个特殊的关键,并使用它来使用API​​,所以Google可以跟踪你是否以合法的方式使用API​​。

0

由于您建议人们能够看到您的代码,我猜他们也将能够在其硬件上运行该软件(这意味着他们有root和任何只读限制将最终失败) 。

,我能想到的唯一可靠方法如下:

  • 让自己的电子签名的智能卡
  • 加密和你的公钥密码并保存它

这种方式使用您的凭证的唯一方法是使用在卡上以只读方式存储并使用附加密码(PIN码)访问的私钥解密它们。

正如Pointy所提到的,如果没有人为因素持有保密信息(密码为智能卡的私钥和物理所有权),则无法使信息100%安全。

0

您应该使用散列函数,并且您的数据库密码不应该作为明文存储,而应存储为散列值。然后你只提供散列给数据库,因为它里面还有散列,你没有什么可担心的。

但是,如果您必须在您的程序中使用明文,那么在您将它们提供给数据库时,具有调试器的攻击者可以找到用户名和密码的值。更甚的是,外部攻击者可以通过嗅探工具(例如wireshark)观察您的网络,如果使用不安全的网络协议,则只需获取这些值。因此,在程序流程中,不建议使用任何明文用户名密码对。

如果你必须这么做,无论如何,最安全最安全的方法是加密你的用户名/密码对,当他们被发送到服务器的时候,你应该解密它们并作为明文作为服务器发送不会理解加密。但是,如果你有权访问服务器,也许你应该修改一下它,因此它不会将密码存储为明文。

干杯。

1

您没有提及代码的部署位置。如果您的应用程序在您的客户机器上运行并直接发出Web服务请求,则无法阻止某人获得凭据。即使您对它们进行了加密,应用程序也必须能够使它们可用,因此解密密钥必须对其可用,因此对您的用户也是可用的。即使您可以安全地对其进行加密,用户也可以使用其他方法,例如嗅探出站网络流量。

如果使Web服务调用的代码位于您的服务器上,那么您有同样的问题,但至少控制环境。在某些时候,服务器必须将加密的凭证呈现为可用的形式以发出Web服务请求,因此您可以加密Web服务凭证,但密码或证书必须可供代码访问。除非每次都有一个人在输入证书的密码短语,所有这些都是嵌套凭证,但并不保证它们的安全。

当然,这个答案并不是试图解决代码中不安全的Web服务需求的问题。要么找到一个可以调用的更安全的等效Web服务(可能是使用API​​密钥和用户自己的凭据或生成安全令牌的Web服务),或者游说Web服务提供商以正确方式进行操作。看看Twitter和Facebook上安全性的最新进展 - 用户需求可以有所作为。

0

正如其他人所指出的那样,隐藏您的密码没有神奇的方法(这是逻辑上不可能的,c.f. DVD复制保护),但是您应该采取一些安全预防措施以尽量减少损害的可能性。

如果不控制服务器(例如,你在共享主机上运行你的应用程序),然后:

  • 确保您登录到网络服务帐户(与MyUserName输入/ MyPassword输入)只有为此应用程序的目的所需的最低权限。
  • 只能使用此帐户一个部署(因此,如果它已被破坏,您可以锁定此帐户而不影响其他应用程序/安装)。

而且如果你控制的服务器,然后除了

  • 安全服务器,即正常持续的系统管理员的任务,如防火墙,安装最新的补丁,监控日志等。
相关问题