您的位置:首页 > 其它

登陆界面的数据存储(没有显式使用其他保存媒介)

2017-08-24 11:51 447 查看
创建一个WPF应用后,工程目录里会有一个默认app.config文件,这个文件里面可以存储一些程序常用的数据,

并且在编译后生成目录上会有一个xml文件生成,就是记录此数据的。

对于如下界面:



app.config数据中的格式为以下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<appSettings>
<add key="server" value="127.0.0.1"/>
<add key="database" value="VoiceRecord"/>
<add key="userName" value="sa"/>
<add key="password" value="x123!@#"/>
<add key="savePath" value=""/>
</appSettings>
</configuration>其中<appSettings>节点中包含了上图中所显示的数据,savePath是修改后的,其实在代码中给了默认值。
在代码中可以通过ConfigurationManager类中的AppSettings属性来获取具体的值:

/// <summary>
/// 读取客户设置 settingName对应app.config的AppSettings里的Key
/// </summary>
/// <param name="settingName"></param>
/// <returns></returns>
public static string GetSettingString(string settingName)
{
try
{
string settingString = ConfigurationManager.AppSettings[settingName].ToString();
return settingString;
}
catch (Exception)
{
return null;
}
}
更新其中的值:
/// <summary>
/// 更新设置
/// </summary>
/// <param name="settingName"></param>
/// <param name="valueName"></param>
/// 没有提供直接修改的值的方法,所以需要通过先删除后添加的方式修改值
public static void UpdateSettingString(string settingName, string valueName)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (ConfigurationManager.AppSettings[settingName] != null)
{
config.AppSettings.Settings.Remove(settingName);
}
config.AppSettings.Settings.Add(settingName, valueName);
config.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection("appSettings");
}
在文本框里面添加LostFocus事件触发更新即可修改。
在生成的目录里面可以看到以*.exe程序结尾的程序和以*exe.Config结尾的文件,*.exe是程序,*exe.Config的就是appConfig.xml经过处理的配置文件了,里面的内容为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<appSettings>
<add key="server" value="127.0.0.1"/>
<add key="database" value="VoiceRecord"/>
<add key="userName" value="sa"/>
<add key="password" value="x123!@#"/>
<add key="savePath" value=""/>
</appSettings>
</configuration>可以看到,生成数据里面和之前是一样的。

然而到这里,问题来了,登陆密码及用户名这样敞开的真的好吗?

对于一些隐秘数据可以采用加密的方式输出。登陆界面上需要保存用户名和密码之类的数据,生成的xml文件不能以明文的方式存储,不然就可以查看到,这是不安全的,所以在生成过程中可以采用加密的方式。

Configuration类中包含的ConfigurationSection提供加密的方法,示例代码:

//加密app.Config中的指定节
        // sectionName为节点 eg:appSettings
        private void ProtectSection(string sectionName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.GetSection(sectionName);
            if (section != null && !section.SectionInformation.IsProtected)
            {
                section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                config.Save();
            }
        }经过加密后的*exe.Config文件里面显示为:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<appSettings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAQN3ZN4bHl0+6ROYrpkB78gQAAAACAAAAAAADZgAAwAAAABAAAAB63UqbYejevg4TL4eTUdC6AAAAAASAAACgAAAAEAAAAMk5zWOml6z93QekcSOuo33oAQAA3hi+/3jHcPSPuRODe23cGhda0ZaC33MIU7ZIYqg3wcI44c7GxCmiCH5sB7vFGb4rAwOuJi20nxWpMOTwklqAyxBxlMtTVDvf6KT1eo89tZ8dAGhHt1Dmp2jSEZL2es/719ALgTf0V1E/4Q3ZjOQ14i/eXxM4aVypiVswXwJLZb7QT0ohIQq5MDeEuyR4nstl/pMdH5MG8F8vrE3YC7VIUWqC+W15V6YInO4fICirLyYi/kxWA/5ueHivGbJR/+l+F54BZBc0OAwTEnw58ZYI9UFOP7WhXUs3HyLH0sMS1B/5KVxZLpPvNyzj9b9aSReUICRSyQYDQAjq08g91gWG6mTkcMfJL/KjkQaYW8Yux5Me4+VaeXdk0AVdRzISDFRGyadHs3KtVXHPhK7KEHWmF6bS94t73ZrWsa0qnArULsb4OIlIysdW6WTVDNC+tZpNFLVuS3Y5JznOxGYsHShPsF4aXXksYJSK3+Hb0jjKoJFEK5xXs9BNA/+Pd0PIIGMHItTe9x/igjCnfQRZC2jrkUh65m6XzaKYNc1BjZRPAfv9qRc8cq0eUy9FiCp8HztzwviDl3P4kLm2jCzmrK4lpRTbHYwhBtIzSRU/V/NwQPNztnyUwC53LtcWUFUFZUk/BZkJ3U1id1wUAAAAVaa81Jhbj9dasmvS2T96bjMNq44=</CipherValue>
</CipherData>
</EncryptedData>
</appSettings>
</configuration>可以看到<appSettings>节点已经显示为加密了。
在使用过程中,并不需要去界面,这部分会自动完成的,保证在使用过程中数据使用的是解密后的数据。下面还是提供对应的解密方法

解密方法:

//解密app.Config中的指定节
        private void UnProtectSection(string sectionName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.GetSection(sectionName);
            if (section != null && section.SectionInformation.IsProtected)
            {
                section.SectionInformation.UnprotectSection();
                config.Save();
            }
        }

使用Configuretion类需要引用System.Configuration命名空间。
选择路径框需要引用System.Windows.Forms命名空间以及添加System.Windows.Forms程序集。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐