将密钥文件存储为嵌入式资源(它有多不安全?)

Posted

技术标签:

【中文标题】将密钥文件存储为嵌入式资源(它有多不安全?)【英文标题】:Store key file as embedded resource (how unsafe is it?) 【发布时间】:2015-08-02 19:22:55 【问题描述】:

如果我有一个存储的密钥文件用于解密进入我的应用程序的加密输入,并且我将该密钥文件存储为嵌入式资源,以便在部署时将其嵌入到程序集中,那么对某人来说有多难对应用程序进行逆向工程并检索密钥文件?

此外,应用程序是通过 ClickOnce“仅在线”模式部署的,我想这也会使逆向工程变得更加困难? (我不太确定 ClickOnce 的工作原理,但在以仅在线模式运行应用程序后,我无法在本地计算机上找到 dll/程序集...)。

更新: 由于 Ralf 在他的评论中基本上回答了以下主要问题(回答:这根本不安全),这里有一些更多信息,以便知识渊博的人可以建议更好的安全模型。

加密将用于加密我的应用程序的登录密码,用于 SSO 设置(用户将首先登录到不同的系统,然后通过单击链接将能够直接打开我的应用程序,而无需输入他们的登录详细信息)。

加密数据将作为 base-64 字符串 URL 参数发送到链接中,该链接将启动 my click-once 应用程序。

我还将开发为 URL 参数创建加密数据的应用程序(澄清:不是用户为 SSO 登录的第一个应用程序,我只会正在创建一个小工具来将纯文本密码转换为加密的 base64 字符串)。

它只是一个内部应用程序,因此防弹安全性并不是必不可少的,而且易于部署更为重要,但最好了解可用的最佳实践和不同选项。

【问题讨论】:

转到任务管理器。找到你正在运行的进程。找到打开路径菜单项以打开您的程序所在的文件夹。使用任何可用的 Resource Hacker 工具,您将获得嵌入式资源,从而获得关键。如果您知道资源中应该有一个密钥,则可能只需几秒钟即可获得它。 这就像把你公寓的门钥匙放在盆栽下面一样安全。 加密数据从何而来? 好的,所以根本不安全。充其量是通过默默无闻的安全。我喜欢@HansPassant 的例子。不是很安全,但可能足以让诚实的人保持诚实。 @NeilSmithline 数据是作为 URL 参数传递给单击一次应用程序的登录密码(在启动应用程序的链接中)。它只是一个内部应用程序,安全性实际上并不那么重要,比我们不想以明文形式发送密码更重要。 【参考方案1】:

无论是明文还是加密,您都不想存储密码。当你得到一个密码时,你应该做的就是将它传递给你的服务器应用程序,在那里你将它与你在数据库中的密码的加盐哈希进行比较。即使您认为安全性不那么重要,您也需要注意密码,因为人们经常在不同系统中重复使用密码。我知道他们不应该,但他们会这样做。

如果您想实现单点登录 (SSO),请在服务器端创建一个登录令牌并将其传递回客户端,无论是加密的还是签名的(HMAC 是一个不错的签名选择)。这是一个不可伪造的令牌,因为您需要知道 HMAC 的加密密钥或共享密钥,并且该数据仅在您的服务器上是已知的。因此,您拥有 SSO,并且所有涉及 SSO 的数据都在服务器上进行管理,因此不会出现数据泄漏或欺骗的可能性。

【讨论】:

我无法使用登录令牌,因为我无法更改调用应用程序 - 我所能做的就是为他们提供工具来加密他们将作为 URL 的一部分发送的密码我的应用程序的参数。但是,密码不会由用户生成,因此在某种程度上它们类似于令牌。 如果你不能改变客户端,那我猜你是相当有限的。【参考方案2】:

只要应用程序可以启动,文件就必须位于计算机上的某个位置。你只需要知道去哪里找。逆向工程可能很丑陋,但总是有可能的。计算机必须能够理解他应该做什么,所以你只需要提取他正在寻找的信息。因此,您的应用程序的安全性永远不应取决于逆向工程的难度!我相信一个安全的应用程序无论如何都应该是开源的。

您可能需要不同的安全模型。这里重要的是您知道要保护数据的内容。如果您只是想知道数据是由服务器而不是其他人(中间人攻击)发送的,则可以使用数字签名。 如果您不希望任何人读取服务器和客户端之间发送的任何数据,您应该使用某种 ssl 实现来创建加密通道。然后你只需要注意服务器的公钥在客户端没有被改变。这可以通过官方 CA 的证书来完成,但不幸的是,这些证书通常不是免费的。

【讨论】:

公共 CA 仅适用于您仅控制一侧通信的情况。如果您控制不需要公共 CA 的客户端和服务器,只需制作一个私有 CA 并在您的应用程序中安装您的 CA 证书,然后您就可以为您的应用程序与之通信的任何服务制作所需的所有证书,并且它可以根据应用程序内置的硬编码 CA 证书验证它们。 @ScottChamberlain 安装到我的应用程序中的私有 CA 证书会比常规密钥文件更安全吗?如果有人对应用程序进行逆向工程,他们是否能够检索硬编码的 CA 证书? @JPProgrammer 是的,他们可以,但他们无法仅从 CA 证书生成新的有效证书(如果他们要进行 MITM 攻击,他们需要这样做),他们还需要您只能在公司内部服务器上拥有的私钥。它与公共 CA 相同,您的计算机上也有他们的所有证书,您唯一可以对它们做的就是验证签名证书。 这里我要补充一点,私有证书的验证只能由服务器完成。由于应用程序是通过网络交付的,因此没有第 3 方就无法抵御中间人攻击。

以上是关于将密钥文件存储为嵌入式资源(它有多不安全?)的主要内容,如果未能解决你的问题,请参考以下文章

使用 TPM2 安全地存储密钥

Android 硬件支持的密钥库中的 PublicKey 有多安全?

-retainCount 到底有多不可靠? [关闭]

将项目的密钥存储在并发字典中,该项目的密钥作为在C#中的字典中出现的次数

编译后包含在我的 xcode 项目中的 plist 有多安全?

如何获取 Azure 存储帐户密钥