溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中NET環(huán)境下WebConfig如何加密

發(fā)布時(shí)間:2021-11-23 11:48:00 來源:億速云 閱讀:200 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“C#中NET環(huán)境下WebConfig如何加密”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C#中NET環(huán)境下WebConfig如何加密”這篇文章吧。

在將ASP.NET項(xiàng)目部署到服務(wù)器上時(shí),內(nèi)網(wǎng)環(huán)境下Web.Config往往是直接復(fù)制過去。對(duì)于外網(wǎng)環(huán)境,則需要對(duì)Web.Config文件進(jìn)行加密。

.NET環(huán)境下一共提供了2種方式的加密功能,分別是DpapiProtectedConfigurationProvider和RsaProtectedConfigurationProvider提供程序。

前者在本機(jī)加密Web.Config后,只能在本機(jī)進(jìn)行解密,如果需要將Config文件復(fù)制到外部主機(jī),則無法進(jìn)行解密。后者在本機(jī)加密Config文件后,可以到處密鑰容器,當(dāng)把Config文件復(fù)制到外部主機(jī)后,可對(duì)先前導(dǎo)出的文件進(jìn)行導(dǎo)入功能,導(dǎo)入后既可自動(dòng)解密。

由于經(jīng)常需要復(fù)制Config文件到外部主機(jī),因此Rsa保護(hù)程序更加適用于實(shí)際業(yè)務(wù)場(chǎng)景,本文將詳細(xì)介紹RsaProtectedConfigurationProvider程序的使用步驟。

1. 使用RsaProvider提供程序,需要首先進(jìn)入.NET Framework運(yùn)行環(huán)境,可以配置環(huán)境變量或使用cd指令。

cd  C:\Windows\Microsoft.NET\Framework\v2.0.50727

2. 接著便可以使用aspnet_regiis.exe創(chuàng)建一個(gè)Rsa密鑰容器。密鑰容器分用戶級(jí)別和計(jì)算機(jī)級(jí)別兩種情況,由于使用用戶級(jí)別密鑰沒什么益處,一般使用計(jì)算機(jī)級(jí)別既可。

aspnet_regiis -pc "MyKeys" -exp

3. 創(chuàng)建密鑰容器后,還需要設(shè)置密鑰容器的訪問權(quán)限,下面的命令授予NETWORK SERVICE 帳戶對(duì)計(jì)算機(jī)級(jí)別的 “MyKeys” RSA 密鑰容器的訪問權(quán)限。msdn上有一個(gè)aspx程序會(huì)展示你的asp.net程序的用戶標(biāo)志,不過本人實(shí)際執(zhí)行pa指令后會(huì)報(bào)錯(cuò)。

aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

4. 在Web.Config文件中加上如下配置節(jié)點(diǎn),MyProvider為你的保護(hù)程序名稱,可隨意指定。keyContainerName為前面設(shè)置的密鑰容器名稱,useMachineContainer為true表示使用計(jì)算機(jī)級(jí)別密鑰,為false表示使用使用用戶級(jí)密鑰。

這段配置節(jié)不要像msdn那樣直接放在configure配置節(jié)點(diǎn)下面,這樣會(huì)報(bào)錯(cuò),建議放在你需要加密節(jié)點(diǎn)的后面。

   <configProtectedData>
      <providers>
         <add name="MyProvider"
              type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
                    Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
                    processorArchitecture=MSIL"
              keyContainerName="MyKeys" 
              useMachineContainer="true" />
      </providers>
   </configProtectedData>

 5 .下面的指令將對(duì)指定路徑下的config文件節(jié)點(diǎn)進(jìn)行加密,如果配置文件中還有session的sql連接字符串,也可以對(duì)sessionState節(jié)點(diǎn)進(jìn)行加密。

aspnet_regiis -pef "connectionStrings"  "D:\WebApp"  -prov   "MyProvider"

aspnet_regiis -pef "system.web/sessionState"  "D:\WebApp"  -prov   "MyProvider"

  加密后的connectionStrings節(jié)點(diǎn)如下所示,此時(shí)仍可訪問ASP.NET應(yīng)用程序。

  <connectionStrings configProtectionProvider="MyProvider">
    <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>X3XoBfbo/h9QUeVUV8A1EGMM0NQuBnhfuC/iV1e7CCmGaiRt9ogmICenTK8VAmGfhufPzWFu5UUHSiO/6BIvYPEO5WoWlj3h6/sUQmRj6NsAJOnrnYHEjta4oQb4XajxazWcf3HUeWR0mG4wDCiUfTZaRIRmXkGgfbxewpsKJ5k=</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>suqFgGjGFaon62YNI2VM5SQymcf4yyAku9fWQuvgClj1bfqixK9kIs9IE0I0m2u4gLbF+y0xPharfcOFJpXHDwHoaCrNQsxsutqiXquX67bYcJeYaMz5ja9ebqAtQvKIiZ/kHGvFIPXSCg5HiW/GGQwaf3FESVEsOaSAJZ3JJk9MlkkwDd6LepgtcCVjLnEK0lOeEFznrngizFFZWAsYjh6UCF5lNxNxf/IBwtznsfiFi2tV1F4sx9HkJEEryf5MEtu1RAA/wqarMvn7dlXhpGconpNPXA1IGlTmaZ/S1bR/FsO39skgHrs+OHsDMbJrI5ZO4TXXbK/DD86GPzu9JXrVKNVImzzW0V8aMc2HcVNClPsMwwgGaH6PNhE0xkjV6YH77XcLdVsKibvnwMlO/4kjGKoNXaSkFBoAEgprzi8=</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>

 如果需要解密,可以執(zhí)行下面這條指令aspnet_regiis -pdf "connectionStrings" "D:\WebApp"

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-WebApp-20170622060005.mdf;Initial Catalog=aspnet-WebApp-20170622060005;Integrated Security=True"providerName="System.Data.SqlClient" />
</connectionStrings>

6. 導(dǎo)出密鑰容器,密鑰信息將被存儲(chǔ)在導(dǎo)出的xml文件中,pri表示將公鑰和私鑰一起導(dǎo)出。

aspnet_regiis  -px "MyKeys" "D:/MyKeys.xml"  -pri

7.  有了這個(gè)xml文件,就相當(dāng)于有了密鑰容器,導(dǎo)出密鑰容器后可以對(duì)密鑰容器進(jìn)行刪除,刪除指令如下。

aspnet_regiis  -pz  "MyKeys" 

8. 刪除密鑰容器后,如果前面你沒有對(duì)Config文件進(jìn)行解密,那么運(yùn)行ASP.NET程序?qū)?huì)直接報(bào)錯(cuò)。

    在本人實(shí)際操作中發(fā)現(xiàn),如果對(duì)正在運(yùn)行的ASP.NET應(yīng)用程序的Web.Config文件進(jìn)行加密,加密后立即刪除密鑰,此時(shí)點(diǎn)擊運(yùn)行(不調(diào)試)仍可正常訪問。這表明Rsa解密操作在內(nèi)存中執(zhí)行,只有重新生成解決方案或調(diào)試(會(huì)執(zhí)行生成操作)后,訪問才會(huì)報(bào)錯(cuò)。

9. 現(xiàn)在可以將加密后的config文件和導(dǎo)出的MyKeys.xml一起復(fù)制到服務(wù)器上,此時(shí)運(yùn)行網(wǎng)站將會(huì)直接報(bào)錯(cuò),需執(zhí)行下面的導(dǎo)入指令。

aspnet_regiis -pi "MyKeys"  "D:/MyKeys.xml"

導(dǎo)入后,在本機(jī)訪問ASP.NET網(wǎng)站會(huì)發(fā)現(xiàn)仍然報(bào)錯(cuò),提示無法open  Provider。這個(gè)坑最終在網(wǎng)上找到解決方法,如下面指令所示,需要為應(yīng)用程序池設(shè)置對(duì)密鑰容器的訪問權(quán)限。

aspnet_regiis -pa "MyKeys"   "IIS APPPOOL\MyWeb" -full

自此整個(gè)流程已結(jié)束,可以將上面這些指令封裝成2個(gè)批處理程序,一個(gè)是密鑰制作bat,一個(gè)是導(dǎo)入bat,如下所示。

@echo on
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727::設(shè)置config地址,config文件要在E:\test下面
set configAddress="E:\test"::創(chuàng)建RSA密鑰容器
aspnet_regiis -pc  "MyKeys" -exp

::設(shè)置密鑰容器訪問權(quán)限
aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"::加密
aspnet_regiis -pef "connectionStrings"  "D:\WebApp"  -prov   "MyProvider"aspnet_regiis -pef "system.web/sessionState"  "D:\WebApp"  -prov   "MyProvider"::導(dǎo)出
aspnet_regiis  -px "MyKeys" "D:/MyKeys.xml"  -pri

::刪除密鑰容器
aspnet_regiis  -pz  "MyKeys" pause
@echo on
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727::刪除舊的密鑰容器
aspnet_regiis  -pz  "MyKeys" ::導(dǎo)入新的密鑰容器
aspnet_regiis -pi "MyKeys"  "D:/MyKeys.xml"::設(shè)置應(yīng)用程序池的訪問權(quán)限
aspnet_regiis -pa "MyKeys"   "IIS APPPOOL\MyWeb" -full

pause

在寫完這2個(gè)bat后,我想起前面的解密指令aspnet_regiis -pdf "connectionStrings" "D:\WebApp",它只需要提供節(jié)點(diǎn)名稱和路徑。也就是說,如果***者能夠在被***的服務(wù)器上執(zhí)行cmd指令,那么他就可以對(duì)config進(jìn)行解密。這個(gè)問題如有前輩有更好的解決方式,歡迎您指導(dǎo)留言。

如果當(dāng)初微軟編寫這個(gè)指令解析方法時(shí),加上一個(gè)key的參數(shù)。那么即使***者能夠執(zhí)行cmd指令,由于不知道key的名稱,所以仍然無法對(duì)config進(jìn)行解密。

以上是“C#中NET環(huán)境下WebConfig如何加密”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI