管理 VSPackage 中的敏感选项数据

Manage sensitive Options data in VSPackage

我正在开发一个需要连接到数据库的 Visual Studio 扩展包 (VSIX)。

我还想在存储敏感配置时采取合理的安全预防措施。

目前,我正在为我的插件使用标准的 属性-grid 选项页面,如 Visual Studio 扩展的 introductory documentation 中所述。

public class MyPackageOptions : DialogPage
{
    [Category("Repository")]
    [DisplayName("Server")]
    [Description("Database host name or IP address")]
    public String Server { get; set; }

    [Category("Repository")]
    [DisplayName("Port")]
    [Description("Database listen port")]
    public UInt16 Port { get; set; } = 3306;

    [Category("Repository")]
    [Description("Database name")]
    public String Database { get; set; } = "default_database_name";

    [Category("Repository")]
    [DisplayName("User ID")]
    [Description("Database login user name")]
    public String UserId { get; set; }

    // BUG PasswordPropertyTextAttribute doesn't seem to be having the desired effect
    [Category("Repository")]
    [Description("Database login password")]
    [PasswordPropertyText]
    public String Password { get; set; }
}

CategoryDisplayNameDescription 属性在 属性 网格显示上具有我期望的效果。但是 PasswordPropertyTextAttribute 似乎没有任何效果。有没有其他方法可以使文本屏蔽与基本的 属性-基于网格的选项页面一起使用?或者我是否需要制作自定义选项 UI 表单来获取文本屏蔽?

其次,我如何确保密码字段值以合理安全的方式保存在磁盘上,类似于其他需要存储用户凭据的软件?对于我的需要,我认为使用当前用户帐户的 Windows DPAPI 保护就足够了,但我不确定如何使用它来保护 MyPackageOptions.Password 属性 .

要使 PasswordPropertyTextAttribute 生效,必须通过将其 Password 属性 设置为 true 来“打开”它。如果使用默认构造函数,则 Password 属性 为 false 并且该属性无效。

使其工作的最简单方法是使用 [PasswordPropertyText(true)] 行而不是 [PasswordPropertyText] 行将属性添加到 属性 以调用适当的 non-default构造函数。

可以通过覆盖 DialogPage LoadSettingsFromStorage, SaveSettingsToStorage, LoadSettingsFromXml, and SaveSettingsToXml methods as described in .

来加密持久化选项值

实现自定义 TypeConverter 来处理 encryption/decryption(类似于 this approach)没有用,因为相同的 TypeConverter 用于转换 to/from PropertyGrid 中的字符串值,以及在 Visual Studio 注册表或 XML 导出中保留值时。因此,如果转换器可以处理 PropertyGrid 中的纯文本输入,那么当对象保存到存储或导出到 XML.

时,它也会生成纯文本字符串。