我应该如何存储我的应用程序在VB.net中使用的敏感数据?

时间:2014-07-02 16:05:31

标签: vb.net string encryption obfuscation securestring

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

要求

目前我正在使用"设置"存储在我的应用程序设置中以存储多条信息,包括:

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

我一直在使用'设置'存储,因为坦率地说,它更容易在一个中心位置更改值,并在我的代码中反映出来。

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

我需要做到这一点,以便有人不能使用.NET反射器并获取所有这些信息。 - 在尝试使用SmartAs后,became quickly apparent表示"设置"容器在混淆期间被忽略了。

前进之路?

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

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

    让我们说例如我试图隐藏以下字符串。

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

    如果提供答案的用户可以提供一个小的PoC来展示我如何保护上面的字符串以及如何在我的程序中引用它(如果你是这样的话),我将非常感激。倾向于加密例如)。

1 个答案:

答案 0 :(得分:1)

二进制序列化将呈现Dates和Integers之类的内容,因此无法轻松读取,但字符串则不然。 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>允许你做任何你做的UnDo。任何具有默认值(Private _foo As String = "bar")的支持字段都可能/应由您的工具处理。

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