在这种情况下,在机器上安全地存储密码?

时间:2014-10-23 22:34:04

标签: c# encryption credentials

我正在尝试为我的应用程序找到一种存储用户名和密码的方法(必须在解密后以原始格式检索 - 哈希不是一个选项)。乍一看,我想到了一些简单的加密算法。

然而,大多数加密算法(甚至使用SALT或PEPPER的算法)都存在缺陷,因为反编译C#可执行文件可以很容易地判断出SALT和PEPPER是什么,以及代码是如何解密的。这可以通过混淆代码来解决 - 但是,最终甚至可能会被破坏。

我意识到我可能会在这里走极端。但是,我的应用程序将被世界各地的大公司使用,安全性非常重要(哦,我也假设对解决方案感兴趣)。

该程序只能在Windows 7或更高版本上运行。

最初我查看了C#中的ProtectedData class,这使得当前用户的密码安全。但是,我也希望当前程序的安全性(如果可能),以便在同一用户上运行的其他程序无法获取密码。

最后,我意识到Windows 7及更高版本在控制面板中有一个Credentials Manager,并且应用程序可以与此进行交互(and so can C#)。

但是,Credentials Manager是否保护当前用户,以及当前程序?同一用户的其他程序是否仍可以访问凭据?

如果是,是否存在完全保护这些数据的方法?我相信Windows 7的凭据管理器足够安全,但我只关心其他应用程序可以自由地获取我的应用程序的数据。

编辑 - 应该提到我有来自StartSSL的代码签名证书,如果有任何用处的话。不知道这会有什么帮助,但也许你有一个线索。

1 个答案:

答案 0 :(得分:2)

你想从谁那里保护密码?

事实是,如果密码存储在本地计算机上,那么对该计算机具有物理访问权限的人可以访问它。这是安全,计算机或其他方面的基本限制。

如果密码对于您的程序用户来说很好,那么Windows Credential Manager实际上是最佳解决方案。如果您希望其他软件无法访问密码,则可以对其进行加密。但请注意,由于您在本地进行解密,因此无论采取何种措施(无论是否使用Windows CM),都可以给予足够的努力来对解密进行反向工程(

)。

如果您甚至不希望用户能够获得密码,则根本无法在本地计算机上安全地存储密码。您必须提出一些其他访问方法,例如让服务器控制,代表用户根据需要将密码应用于资源。当然,那么你就有了验证用户的问题;如果有人发现了他们的密码,那么他们最终会获得该用户对您想要保护的资源的访问权限。

底线:使用可用的工具,最好是内置的OS功能。不要把更多的精力放在安全上,而不是资产价值的合理性,并且尽量重用“官方”安全机制,而不是试图重新发明自己的安全机制。