登陆界面的数据存储(没有显式使用其他保存媒介)
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程序集。
并且在编译后生成目录上会有一个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程序集。
相关文章推荐
- 密码对象登陆界面的数据保存回显的操作
- html5使用local storage存储的数据在本地是以何种形式保存的
- 近日探得用C++将二进制数据存储到XML文件的方法,由于在研究时,未得到网上其他同仁的帮助(网上搜索了半天没有相关资料,只有.NET的),在这里不敢独享,给别的同仁在搜索时能够搜索到相关资料,也算是绵薄之力! )
- (十)android 中数据存储与访问——使用SharedPreferences保存数据
- MySQL存储过程从另外两个表中取数据存整合其他数据保存在一张新的表里
- 安卓四大组件之一#2-一使用Intent显式意图实现界面跳转以及数据传递
- 登陆界面的数据保存回显的操作
- 九、使用SharedPreferences进行数据存储-- 不同点:访问其他应用中的Preference
- iOS学习(三十三)使用NSUserDefaults简单的登陆界面保存用户名,下次启动并显示出来
- Android数据存储之SharedPreferences的简单使用(保存用户名和密码)
- 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。 虽然使用其他方法也可以对外共享数
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- Android开发之完成登陆界面的数据保存回显操作实例
- 使用文件保存数据以及在此基础上实现判断登陆账号密码匹配问题的实现
- word2003保存文时总是提示“文档被保存,但是语音识别的数据丢失,因为没有足够的空间存储这些数据。确保没有录音时关闭麦克风,并检查磁盘上的存储空间。[转]
- 【学习笔记】day2数据存储和界面展现第一天 08_使用api获取内部存储空间路径09_files文件夹与cache文件夹
- Android开发(6)--完成登陆界面的数据保存回显的操作
- 数据存储--SharedPreferences--仿QQ登陆界面记住密码效果
- Android开发(6)--完成登陆界面的数据保存回显的操作
- “文档被保存,但是语音识别的数据丢失,因为没有足够的空间存储这些数据。确保没有录音时关闭麦克风,并检查磁盘上的存储空间。”