1

我遇到的一个问题是试图找到一种方法来安全地存储某些信息。我仍在学习和试验 .NET 作为入门语言以及 C。因此,如果我缺乏基本逻辑,请耐心等待。

要求

目前,我正在使用我的应用程序设置中的“设置”存储来存储几条信息,其中包括:

  • SQL 连接字符串(带有凭据)
  • SMTP 服务器设置(带有凭据)
  • 其他各种带有信息的敏感字符串,我不希望有人找到(至少不是没有相当大的努力)

我一直在使用“设置”商店,因为坦率地说,能够更容易地在一个中心位置更改值并将其反映在我的代码中。

我当然意识到我可以很容易地创建一个共享类并将其用作所有这些设置的参考。

我需要做到这一点,以便有人不能只使用 .NET 反射器并获取所有这些信息。- 在使用 SmartAssemply 进行试验后,很快就发现“设置”容器在混淆过程中被忽略了。

前进的方向?

所以我做了一些研究,目前我面临着我认为主要的可能前进方式。(请记住,这是来自我有限的经验)

  1. 创建一个新的共享类,让 SmartAssembly 使用它的混淆方法来隐藏字符串。
  2. 创建一个 INI/XML 文件以与主应用程序并排(外部)放置。这将被加密并在应用程序需要引用任何包含的设置或字符串时被解密。(虽然我想得越多,我认为它似乎就越有缺陷)
  3. 创建一个新的共享类并试验SecureString类?(PoC 将不胜感激)
  4. 你的想法?

例子

例如,假设我试图隐藏以下字符串。

Dim ConnStr As String = "server=100.100.100.1;user=admin;database=database2;port=3306;password=password123"

如果提供答案的用户能够连同他们的建议一起提供一个小型 PoC,我将非常感激,该 PoC 展示了我如何保护上述字符串以及如何在我的程序中引用它(例如,如果你倾向于加密)。

4

1 回答 1

1

二进制序列化将呈现日期和整数之类的内容,因此它们不容易被读取,但对于字符串则不然。NET BinaryFormatter 甚至会使用属性名称作为键,结果类似于

"SecretEmail" / "Sam@somewhere.com"
"ExpiryDate" / <binary>

我非常喜欢 ProtoBuff-NET 的灵活性。它是标准 NET BinaryFormatter 的替代品,并为此提供了一个简单的选项:

<ProtoBeforeSerialization>
Private Sub Encryptor()
    _foo = Crypto.Encrypt(_foo)
    _bar = Crypto.Encrypt(_bar)
    _secret = Crypto.Encrypt(_secret)
End Sub

<ProtoAfterDeSerialization>
Private Sub Decryptor()
    _foo = Crypto.Decrypt(_foo)
    _bar = Crypto.Decrypt(_bar)
    _secret = Crypto.Decrypt(_secret)
End Sub

字符串数据在应用程序运行时将是明文,但在保存时会加密(这可能不是您想要的)。此外,它使用整数值代替输出中的属性名称。

就在数据被序列化之前,您可以加密或简单地打乱字符串,以便它们仅在加载到应用程序时才可读。同样,<ProtoAfterDeSerialization>将允许您撤消您所做的任何事情。任何具有默认值 ( ) 的支持字段Private _foo As String = "bar"可能/应该由您的工具处理。

还有其他选项,这个选项的优点是在可用于保存文件的序列化机制中为其提供了挂钩。

于 2014-07-02T16:20:26.593 回答