文档章节

解决打不开 RSA 密钥容器 即:加密web.config中的内容

清山博客
 清山博客
发布于 2016/07/15 20:03
字数 1279
阅读 63
收藏 0

简单的解决方法:

WebConfig 加解密,未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。
问题:未添加用于访问 RSA 密钥容器
命令:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
注意事项:XP下:aspnet_regiis -pa "NetFrameworkConfigurationKey" "aspnet"
加密:aspnet_regiis -pe "appSettings" -app "/应用程序名"
解密:aspnet_regiis -pd "appSettings" -app "/应用程序名"  如(/PetShop/web)

更灵活的解决方法:
1、创建一个密钥容器 
   aspnet_regiis -pc "ConnectionStringsKey" -exp
   ConnectionStringsKey为密钥容器的名称 
   可以使用aspnet_regiis /?查看该命令的用法

2、在web.config中加入如下内容<textarea cols="90" rows="11" name="code" class="c-sharp:nogutter">&lt;configProtectedData&gt; &lt;providers&gt; &lt;clear /&gt; &lt;add name="ConnectionStringsKeyProvider"       type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"       keyContainerName="ConnectionStringsKey"       useMachineContainer="true"/&gt; &lt;/providers&gt; &lt;/configProtectedData&gt;</textarea> 
3、通过命令行:用指定的密钥加密指定目录下的web.config文件的指定的配置节
     aspnet_regiis -pef "connectionStrings" "d:/testproj/websitetest" -prov "ConnectionStringsKeyProvider"
    对于子配置节用/分隔表示, 如identity配置节 需要写成 "system.web/identity"
4、如果访问web程序,页面提示 Error message from the provider: The RSA key container could not be opened.
     是由于network service帐户无法访问密钥文件造成的。 找到密钥文件, 赋予network service读权限。该密钥文件位于(可按时间排序,找到自己产生的那个密钥文件)
vista: c:/ProgramData/Microsoft/Crypto/RSA/MachineKeys/
xp或其他:C:/Documents and Settings/All Users/Application Data/Microsoft/Crypto/RSA/MachineKeys

至此:查看被加密的标记, 内容就已经是被加密过的了。

5.通过.aspx页面:加密连接字符串:界面如图:

截图06

后台代码: <textarea cols="88" rows="13" name="code" class="c-sharp:nogutter">//加密按钮 protected void Button1_Click(object sender, EventArgs e) { //①需要加密的节点: string name = @"connectionStrings"; //②当前路径; string appPath = "/loginContral"; Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath); //③提供加密的方式:(这里使用自定义的加密方式) // string provider = "RsaProtectConfigurationProvider"; string provider = "ConnectionStringsKeyProvider"; config.GetSection(name).SectionInformation.ProtectSection(provider); //⑤保存web.config文件 try { config.Save(); } catch (Exception ex) { Response.Write(ex.Message); } if (config.GetSection(name).SectionInformation.IsProtected) { Button1.Enabled = false; Response.Write("加密成功!"); } else { Response.Write("加密失败!"); } } //解密按钮: protected void Button2_Click(object sender, EventArgs e) { //①需要节密的节点: string name = @"connectionStrings"; //②当前路径; string appPath = "/loginContral"; Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath); //③使用UnprotectSection方法进行解密; config.GetSection(name).SectionInformation.UnprotectSection(); //④保存web.config文件 config.Save(); if (config.GetSection(name).SectionInformation.IsProtected==false) { Button2.Enabled = false; Response.Write("解密成功!"); } else { Response.Write("解密失败!"); } } </textarea>

注意:string appPath = "/loginContral" 为当前项目路径;

截图07

加密前的连接字符串:<textarea cols="89" rows="5" name="code" class="c-sharp:nogutter"> &lt;connectionStrings&gt; &lt;add name="connection" connectionString="data source=.;database=aspnetdb;user id=sa;pwd=123;" /&gt; &lt;/connectionStrings&gt; </textarea>     
加密后的连接字符串:

<textarea cols="89" rows="15" name="code" class="c-sharp:nogutter"> &lt;connectionStrings configProtectionProvider="ConnectionStringsKeyProvider"&gt; &lt;EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"&gt; &lt;EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /&gt; &lt;KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"&gt; &lt;EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"&gt; &lt;EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /&gt; &lt;KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"&gt; &lt;KeyName&gt;Rsa Key&lt;/KeyName&gt; &lt;/KeyInfo&gt; &lt;CipherData&gt; &lt;CipherValue&gt;AepogG4vVhd8K6NVhVmdO8FAGFMopOdDvnBN5vPV0mxP8NgrImnZFvflrhhvooiu56McmMr6n5cUnixzimGB/zTgCNMsIkU8Sr6YtX8iUh64U9IVujwaOAbtZp4AhLhMiH6YwkHXjmqrjYyS2ecsocquZQ0ndkKC3OMg/UcOIk0=&lt;/CipherValue&gt; &lt;/CipherData&gt; &lt;/EncryptedKey&gt; &lt;/KeyInfo&gt; &lt;CipherData&gt; &lt;CipherValue&gt;biMAH/6vwvi0FKvqijpSZzKhk+a6QNi0Aa794yxi1X+sffKdtsUR15hVcByOlborcKPRhX94MpOm2eKoBqYVyCf24PdYAkIFFAzO1sluzmUtcXFVU/lTBqn83bnJDgBgo6eVtDg4m7DSAVR6qWyEP8wySqWWuBkWSLzsMynqPOyGhVB9bTVJbSCWiUZ4ynFhvUTziGISJQA=&lt;/CipherValue&gt; &lt;/CipherData&gt; &lt;/EncryptedData&gt; &lt;/connectionStrings&gt;</textarea> 
其他备用操作:
1、解密web.config 
    aspnet_regiis -pdf "connectionStrings" "d:/testproj/websitetest"
2、把密钥容器导出为xml文件 
    aspnet_regiis -px "ConnectionStringsKey" "c:/Key.xml"这个命令只导出公钥,因此以后只能用于加密,而无法解密。
   
aspnet_regiis -px "ConnectionStringsKey" "c:/Keys.xml" -pri  这个则连私钥一起导出了,所以我们要用这个
3、把密钥容器删除  
   aspnet_regiis -pz "LixinKey"   删除后再运行程序,会提示出错: 
    分析器错误信息: 未能使用提供程序“LixinKeyProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。 
    同理可以证明,在任何一台未安装正确的密钥容器LixinKey的机器上,程序都无法对connectionStrings节进行解密,因此也就无 法正常运行。
4、导入key.xml文件 
     aspnet_regiis -pi "LixinKey" "c:/Keys.xml"

     此时,再运行程序会发现又可以解密了。证明加密与解密机制运行正常。
最后说一下这个机制所提供的安全性保障可以运用在什么方面:
1. 对winform程序的app.config进行加密实际意义并不大,因为无论如何,客户机都可以通过运行aspnet_regiis -pdf 来对配置文件进行解密,从而暴露敏感信息。
2. 对于web.config进行加密的意义也仅限于,当web.config文件不小心泄露时,不会同时泄露敏感信息,如果恶意攻击者已经取得了在服务器上运行程序的权限,那么同app.config一样,可以很容易通过通过运行aspnet_regiis -pdf 获取明文了。
3. 还有,通过aspnet_regiis -pa "Key" "NT AUTHORITY/NETWORK SERVICE"控制对不同用户对密钥容器的访问权限,应该还可以进一步获取一些安全性,比如可以控制某些用户即使登录到服务器上,也无法用aspnet_regiis -pdf对配置文件进行解密。

 

本文转载自:http://blog.csdn.net/a497785609/article/details/4536123

共有 人打赏支持
清山博客
粉丝 3
博文 142
码字总数 30397
作品 0
广州
私信 提问
[安全] 关于 RSA 算法的原理与实践

当代信息网络发展至今,覆盖面已经非常广泛,广大用户使用这个互联网络来分享信息,搜索资料,进行商业交易等等,可以说是无处不在,也因为这样,这个领域中的信息安全也就变得越来越重要。在...

长平狐
2012/11/19
841
0
大型网站的HTTPS实践(一)——HTTPS协议和原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/g2V13ah/article/details/83189718 前言 百度于2015年上线了全站HTTPS的安全搜索,默认会将HTTP请求跳转成HTT...

AIOps智能运维
2018/10/19
0
0
asp.net2.0如何加密数据库联接字符串

asp.net2.0如何加密数据库联接字符串 在asp.net2.0中,发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: 1.添加密钥 执行:C:/WINDOWS/Microsoft.NET/Framework/v...

晨曦之光
2012/03/09
116
0
github如何设置SSH Key实现无密码操作

一、密钥是什么?    密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。对称密钥加密又称私钥加密或会话密钥加密算法;非对称密...

懿左左
2018/06/29
0
0
openssl的应用及创建CA

openssl命令行工具: 众多的子命令实现各种安全加密功能; ]# openssl ? 显示的内容有 Standard commands(标准命令) enc, dgst, ca, req, genrsa, rand, rsa, x509, passwd, ... Message Di...

Vayne36
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

dockerfile 镜像构建(1)

通用dockerfile 利用已经编译好的.jar 来构建镜像。要构建的目录如下: [root@iZuf61quxhnlk9m2tkx16cZ demo_jar]# docker build -t demo:1 . 运行镜像: [root@iZuf61quxhnlk9m2tkx16cZ de...

Canaan_
46分钟前
2
0
Redis radix tree源码解析

Redis实现了不定长压缩前缀的radix tree,用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。 核心数据结构 raxNode是radix tree的核心数据结构,其结构体...

阿里云云栖社区
49分钟前
10
0
vue import 传入变量

在做动态添加component的时候,传入变量就会报错,出现以下错误信息: vue-router.esm.js?fe87:1921 Error: Cannot find module '@/components/index'. at eval (eval at ./src/components ......

朝如青丝暮成雪
51分钟前
2
0
Flutter开发 Dio拦截器实现token验证过期的功能

前言: 之前分享过在Android中使用Retrofit实现token失效刷新的处理方案,现在Flutter项目也有“token验证过期”的需求,所以接下来我简单总结一下在Flutter项目中如何实现自动刷新token并重...

EmilyWu
52分钟前
9
0
final Map可以修改内容,final 常量不能修改

1.final Map 可以put元素,但是不可以重新赋值 如: final Map map = new HashMap(); map = new HashMap();//不可以 因为栈中变量map引用地址不能修改 2.final str = “aa”; str = "bb";/......

qimh
55分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部