欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#为配置文件加密的实现方法

程序员文章站 2024-02-11 17:34:10
本文实例讲述了c#为配置文件加密的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,在web.config或app.config文件里我们经常会存储一些敏感信...

本文实例讲述了c#为配置文件加密的实现方法,分享给大家供大家参考。具体实现方法如下:

一般来说,在web.config或app.config文件里我们经常会存储一些敏感信息,比如connectionstrings或者appsettings,比如像下面的文件。

复制代码 代码如下:
<?xml version="1.0"?>
<configuration>
    <system.web>
      <compilation debug="true" targetframework="4.0" />
    </system.web>
    <connectionstrings>
      <add name="mynwconnectionstring" connectionstring="server=myserveraddress;database=mydatabase;user id=myusername; password=mypassword;"/>
    </connectionstrings>
    <appsettings>
      <add key="user" value="myusername"/>
      <add key="password" value="mypassword"/>
    </appsettings>
</configuration>

复制代码 代码如下:
using system;
using system.configuration;

namespace webconfigencrypttest
{
    public partial class webform1 : system.web.ui.page
    {
        protected void page_load(object sender, eventargs e)
        {
            string user = configurationmanager.appsettings.get("user");
            string password = configurationmanager.appsettings.get("password");
            string connectionstring = configurationmanager.connectionstrings["mynwconnectionstring"].connectionstring;
        }
    }
}

一、加密文件可以使用的provider

.net为我们提供了一个工具aspnet_regiis.exe来对web.config文件中的敏感信息进行加密(app.config文件可以先改名为web.config,加密后再改回app.config)。你可以使用两个provider中的一个来进行加密:

system.configuration.dpapiprotectedconfigurationprovider:在system.configuration.dll中,使用windows dpapi(data protection api)来进行加密,密钥存在windows local security authority(lsa)中。

注意:当使用dpapiprotectedconfigurationprovider时,加密文件所使用的帐号需要与运行web application的帐号相同,否则web application无法解密加密的内容。
system.configuration.rsaprotectedconfigurationprovider:在system.configuration.dll中,使用rsa算法来进行加密(rsa算法是非对称加密,具体可参见前面一篇文章c#对称加密与非对称加密),公钥存放在config文件当中,只有加密的计算机有密钥。rsaprotectedconfigurationprovider通常是默认的缺省provider。

二、加密文件的命令

加密web.config文件可以使用:

复制代码 代码如下:
aspnet_regiis -pef section web-app-physical-dir

encrypt the configuration section. optional arguments:

[-prov provider] use this provider to encrypt.

比如运行下面的命令就会分别对connectionstrings和appsettings中的信息进行加密:

复制代码 代码如下:
aspnet_regiis.exe -pef "connectionstrings" "c:\myweb\helloservice"

aspnet_regiis.exe -pef "appsettings" "c:\myweb\helloservice"

C#为配置文件加密的实现方法

加密后的web.config文件变成:

复制代码 代码如下:
<?xml version="1.0"?>
<configuration>
    <system.web>
      <compilation targetframework="4.0" />
    </system.web>
    <connectionstrings configprotectionprovider="rsaprotectedconfigurationprovider">
        <encrypteddata type="http://www.w3.org/2001/04/xmlenc#element"
            xmlns="http://www.w3.org/2001/04/xmlenc#">
            <encryptionmethod algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
            <keyinfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <encryptedkey xmlns="http://www.w3.org/2001/04/xmlenc#">
                    <encryptionmethod algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
                    <keyinfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                        <keyname>rsa key</keyname>
                    </keyinfo>
                    <cipherdata>
                        <ciphervalue>e2fo9c0tjvximlyqzza+fcqddbtpnh/koklrsk6zcfjkgtucl6snmviuu/2g1nvtxqxyewywyk6aicza+feeg/avyvmeevopvdb0yygeujgei1r8hxtl8cv+f2eiimp7lji+jrzveri4mu6ke3wxm2s/atc73/w6eg9808f4/d6j0pp3wnd4e79gbianbhfyqiefdjyusmhr9z9liiqjcllkkj/jb0kso0kgj9i+iew1jae5jugin8gpxsxbcfmw6ru3i3kbpa8z5allfkfa2ykrsuv3c7ellj0kb4lsijiuty3krya4gjdchomlnwwffibhwuppxa25cif0vaq27q==</ciphervalue>
                    </cipherdata>
                </encryptedkey>
            </keyinfo>
            <cipherdata>
                <ciphervalue>i1dwg11iz/rq+nc9c/21b3q22j9+iexhph6kkwvqpehuo6ovoweqbk3whalr2ql8pz0gqjfyftypmk/xssikfi2dcy5mgyy3kp73bqq83ho3o1hpw9tsrtk1g8gmvngyqlj7itrcogfiyymsibpynv1mzsv1qdxlnvfkimqkrz5zpimsmc5u3ddel/jw1ocvags5thrzu5+vgvm0ycmsucwzbxva+iv9j35eqqs58pq+hwvo1hg1dffdupgcbykaxgl5vx3tigc=</ciphervalue>
            </cipherdata>
        </encrypteddata>
    </connectionstrings>
    <appsettings configprotectionprovider="rsaprotectedconfigurationprovider">
        <encrypteddata type="http://www.w3.org/2001/04/xmlenc#element"
            xmlns="http://www.w3.org/2001/04/xmlenc#">
            <encryptionmethod algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
            <keyinfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <encryptedkey xmlns="http://www.w3.org/2001/04/xmlenc#">
                    <encryptionmethod algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
                    <keyinfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                        <keyname>rsa key</keyname>
                    </keyinfo>
                    <cipherdata>
                        <ciphervalue>wvofis8rsegqkw1c0qcmeps7wk6eiogcfdx9ctjnmabovvoewpnoeqwz/6ruu0rgwa7q91kuhgilmy4nen0padnx6fsccdezp6cs59u3ifumymtrd7d9ihqfo2ail/subvv3d2kxhhaygfapuvygsyolf3+ayr3o/uh/k5wzxloiekuurt762j3bdak6cjwqeuou4j2vdxedawdwhlnk12uv8+/axznlfw1n3z0ruvfx1nmswtaiu8f3tz9hcfbgwbtm2t0xnfdocb6dcxcutqc8pxd36laafisanzawoc+yhf5efsj24fx0nu6utqb8fqlyogwsimlxzlkvrwnlmg==</ciphervalue>
                    </cipherdata>
                </encryptedkey>
            </keyinfo>
            <cipherdata>
                <ciphervalue>5w2khg/oetludptobcom52x1qd/g9a0by/wcgxi+fm7edcd8mt3txslvbvchrbcyuo7oihl8nycrdursywyd8ggbcriq5krbamw4lxrnnw/jjjcejwpurcrucvrfpgap2nhh6bxrxc/au6v0gcrqy7lv8179pggtyaa8ie1mv/w=</ciphervalue>
            </cipherdata>
        </encrypteddata>
    </appsettings>
</configuration>

其中rsaprotectedconfigurationprovider是默认的缺省provider,如果想使用dpapiprotectedconfigurationprovider,可以用-prov参数指明:

aspnet_regiis.exe -pef "connectionstrings" "c:\myweb\helloservice" -prov "dataprotectionconfigurationprovider"

aspnet_regiis.exe -pef "appsettings" "c:\myweb\helloservice" -prov "dataprotectionconfigurationprovider"

加密配置文件后,源程序不需要做任何改动。如果要修改或添加新的配置信息,需要先解密配置文件。不论使用哪种provider,都只能在进行加密的计算机上对配置文件进行解密。

三、解密文件的命令

解密的命令如下(解密命令不需要-prov参数):

复制代码 代码如下:
-pdf section web-app-physical-dir

decrypt the configuration section.

aspnet_regiis.exe -pdf "connectionstrings" "c:\myweb\helloservice"

aspnet_regiis.exe -pdf "appsettings" "c:\myweb\helloservice"

C#为配置文件加密的实现方法

四、总结

配置文件中经常会有用户名密码的敏感信息,为了防止该信息泄露,需要对配置文件进行加密。加密与解密可以使用.net提供的工具aspnet_regiis.exe,可以在windows .net的文件夹中找到它。

该工具只对web.config文件进行修改,如果要加密或解密app.config,可以先将app.config文件改名为web.config,加密或解密后再改回来。

希望本文所述对大家的c#程序设计有所帮助。