【问题标题】:How do I store an encryption/decryption key in VB.Net?如何在 VB.Net 中存储加密/解密密钥?
【发布时间】:2016-11-18 19:56:48
【问题描述】:

假设我有一个用 VB.Net 编写的程序,其加密代码依赖于设置的密钥来加密和解密。如何在程序中安全地存储密钥?如果它是代码中的纯文本,则可以对其进行逆向工程。如果是设置,那么它会以纯文本形式存储在 x.exe.config 文件中,并且更容易找到。

x.exe.config 文件可以设置为加密吗?如果不是,将密钥硬编码到程序中的最安全方法是什么?

我使用的方法是使用不同的方法加密的,然后对其进行编码(因为它是非 ascii 文本)并将其存储在设置中,但如果程序被逆向工程,则反过来可以解码。

其他人在这种情况下会怎么做?

【问题讨论】:

  • 这取决于您加密的内容以及您的加密方式。 Windows 有一个加密密钥存储系统,并且有使用它的 API。是否有用取决于上下文和用法。
  • 您需要数据的可移植性也很重要。这些数据是否需要由另一台计算机解密?如果您遇到系统故障并需要将整个程序移动到另一台机器(可能使用不同的机器密钥)怎么办?
  • 与往常一样,您希望保护此密钥免受谁的侵害?您的威胁模型是什么?
  • 该位的目的是存储客户端用来访问数据库的密码。密码被加密并作为文件存储在共享目录中。这很好用,但我担心的是用于创建加密数据的密钥的安全性。所有客户端上的密钥都相同,因此它们都可以解密存储的文件并访问数据库。如果密钥在设置中是纯文本,那么它是什么很明显。如果代码中是纯文本,则可以进行逆向工程。
  • 即使使用像msdn.microsoft.com/en-us/library/bb397867(v=vs.110).aspx 这样的东西也可能是个问题。由于解密的是客户端,因此他们需要完整的密钥。如您所知,我对此很陌生...

标签: vb.net encryption


【解决方案1】:

你已经完成了一项不可能完成的任务。问题是通过将密钥硬编码到程序中,正如您所指出的,用户仍然可以通过逆向工程获得密钥。如果你把它放在某个文件中,程序需要能够读取它,因此用户也可以以同样的方式访问它。

您遇到的根本问题是软件需要访问密钥,为此,密钥必须存储在用户也可以访问的位置。它可以在二进制文件中或在计算机中,但可以分析二进制文件并检查文件系统。加密文件可以保护密钥,但只会用新密钥重新产生问题。

这也是所有 DRM 方案都面临的相同问题。他们允许用户访问完整的软件,但希望以某种方式限制它,但用户在他的计算机中拥有运行该软件的一切。这就是为什么只要付出足够的努力,盗版每个桌面软件都是可能的。您只能通过混淆密钥来使其变得更加困难。

但是那你能做什么呢?

另一种方法是根本不让用户拥有数据库凭据。或者让它们对任何重要的事情都无用。我可以在这里想到两种方法:

  • 让系统与 Web 服务通信,而不是直接与数据库通信。这样,用户只知道服务器的地址,WS 可以根据需要请求任何身份验证,然后再访问 DB。 WS 是唯一一个接触过数据库的人。这就是所有网站在实践中所做的事情,访问者永远不会看到数据库,而是通过网络服务器与之交互。
  • 另一种选择是授予用户直接 DB 访问权限,但这些凭据仅授予调用某些存储过程(或访问没有敏感数据的视图)的权限,而这些凭据又在继续之前请求某种身份验证。这样,只要将其权限保持在最低限度并且特权操作在继续之前得到正确验证,数据库凭据就不会那么敏感。

【讨论】:

  • 感谢亚历杭德罗的详细回复。提案有几个问题。 1) 这需要互联网连接,由于公司政策,客户端 PC 并不总是可行。 2) 动态 SQL 防止存储过程。 SQL Server 访问不是问题,因为客户端程序使用 SQL Server 真实性,因此用户无法直接访问。我正在寻找的是一种加密此“SQL Server 真实性”用户密码的“安全”方式,以便所有客户端都可以访问它。
  • @Tym 1) 我所说的一切都不需要互联网连接,一切都在本地网络中,例如,如果您当前的数据库服务器在 LAN 中。无需上网即可访问局域网。 2)我不知道你在这里指的是什么,但是在存储过程中包含代码并不排除动态SQL的使用。只要您对架构进行适当的更改,这两个选项在您当前的设置中都是可行的。但至于安全地加密数据库凭证,这是不可能的。如果软件可以解密它们,那么任何用户(可能是恶意的)也可以。
  • 对不起,如果我误解了。但是,如果我使用的是 Intranet Web 服务,那么客户端肯定也需要登录,所以我们回到第 1 点...
  • @Tym 很可能是的,需要某种身份验证,但您仍然有很大的优势。您可以请求 application 用户/密码而不是 DB 用户/密码,就像所有网站一样(例如,当您登录到 stackoverflow 时,您输入这些凭据,但我们不知道底层 DB) .客户端改为发送用户必须知道的那些,但他永远不会看到数据库,从而无需保存密码。只需要在客户端配置地址,反正是公开信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多