【潛盾機】web.config連線字串加密工具

ASP.NET 2.0起,web.cofig裡多了connectionStrings區段專門用以儲存資料庫連線字串,同時為避免連線字串中的帳號、密碼等機密資訊曝光,區段內容可以加密方式儲存。例如:

<connectionStrings>
<add name="PlaygroundConnectionString" connectionString="Data Source=(local);Initial Catalog=Playground;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

經加密後會變成:

<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>a44a3giX...略...o+VMsXS8os=</CipherValue>
    </CipherData>
   </EncryptedKey>
  </KeyInfo>
  <CipherData>
<CipherValue>TX5qKv+s...略...3YgrV5wcA==</CipherValue>
  </CipherData>
</EncryptedData>
</connectionStrings>

如此,即便web.config遭竊,拿不到藏在伺服器主機的RSA金鑰,要破解取出帳號密碼資料難如登天。關於加解密web.config區段的做法,微軟MSDN有詳細說明:

但美中不足的是,這些加解密動作目前只能透過aspnet_regiis.exe命令列工具完成,要操作得弄清楚一堆參數。假設今天我們要加密web.config,並部署到三台機器上,全部操作如下:

  1. 用aspnet_regiis -pc "SharedKeys"–exp建立三台機器共用的RSA金鑰容器(Key Container)
  2. 以aspnet_regiis -px "SharedKeys" keys.xml -pri將RSA金鑰容器匯出成XML檔
  3. 將keys.xml複製到三台機器上
  4. 在三台機器上執行aspnet_regiis -pi "SharedKeys" keys.xml滙入RSA金鑰容器
  5. 在三台機器上執行aspnet_regiis -pa "SharedKeys" "NT AUTHORITY\NETWORK SERVICE"授與ASP.NET程式執行權限 (2010-08-30更新: IIS 7.5預設會使用IIS APPPOOL\YourAppPoolName帳號而非NT AUTHORITY\NETWORK SERVICE,詳情可參見保哥的文章,以下應用到授權的地方均比照,不再重複說明。)
  6. 在web.config中加入
    <configProtectedData>
    <providers>
      <add keyContainerName="SharedKey" useMachineContainer="true"
       name="SharedKey" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </providers>
    </configProtectedData>
  7. 使用aspnet_regiis -pe "connectionStrings" -app "/WebApplication" -prov "SharedKeys"加密連線字串區
  8. 將加密後的web.config部署到三台機器上

以上的步驟挺繁雜的,細節頗多,我一直覺得應該要有輔助工具簡化操作較為人性化,因此我寫了Web Config ConnectionString Ecnryptor!

它是一個小工具程式,說穿了只是提供GUI的方式讓使用者輸入選項,完成原本須透過aspnet_regiis.exe才能達成的web.config加解密及RSA金鑰容器管理功能。

操作介面還蠻直覺的,下拉選單可列出本機上所有的網站應用程式,選擇要處理的web.config,下方視窗就會顯示其內容,按下【編輯】鈕可開啟Notepad進行編輯。若web.config的connectionStrings尚未加密,可按下【加密】鈕對連線字串加密;至於已加密的web.config,【加密】鈕會變成【解密】鈕,也是按一下鈕就可解密,省卻原本複雜的操作。

針對RSA金鑰容器的建立、刪除、匯出、匯入,也一併提供了GUI介面進行管理。

另外,順便練習了一下.NET多語系程式開發,程式目前支援英語與正體中文。

以下說明幾種典型應用情境之操作步驟:

  1. 單一網站主機加密(使用預設加密金鑰)
    a) 由下拉選單選取網站應用程式
    b) 按下【加密】鈕
  2. 單一網站主機加密(指定特定金鑰容器)
    a) 由下拉選單選取網站應用程式
    b) 輸入金鑰容器名稱
    c) 按下【加密】鈕
    (web.config中會新增<configProtectedData><providers>並加入以金鑰容器名稱為名的RsaProtectedConfigurationProvider;若該金鑰容器不存在,系統會自動新增,但自動建立的金鑰容器無法匯出給其他機器共用。如針對Web Farm,請參考下一情境。)
    d) 開啟【管理金鑰容器】功能
    e) 輸入金鑰容器名稱,並按下【授權】鈕
  3. 多台網站主機共用指定RSA金鑰容器加密
    a) 啟動【管理金鑰容器】功能
    b) 輸入金鑰容器名稱,按下【建立】鈕
    c) 按【授權】鈕
    c) 按下【匯出】鈕,另存XML檔案
    d) 將XML檔案複製到要部署的網站主機,在該主機執行Web Config ConnectionString Encryptor,使用【管理金鑰容器】功能,輸入金鑰容器名稱,選取XML檔案後按下【匯入】,並執行【授權】(操作完畢請將XML檔案刪除,防止金鑰外洩)
    e) 在下拉選單選取網站應用程式
    f) 輸入金鑰容器名稱
    g) 按下【加密】鈕
    h) 將web.config複製到要部署的網站主機

我將程式及原始碼放到CodePlex中,歡迎大家參考指教!
(聲明: 雖然我認為本工具原理簡單,出錯機率不高,但各位仍請自行衡量風險決定是否使用,在此恕不對它可能造成的任何損失負責。)

CodePlex: Web Config ConnectionString Encryptor

歡迎推文分享:
Published 29 August 2010 04:52 PM 由 Jeffrey
Filed under: ,



意見

# flash said on 31 August, 2010 08:34 AM

CodePlex 只有exe 執行檔並沒有您所說的SourceCode,

請問在哪裡? 還是說沒有開放?

# Jeffrey said on 31 August, 2010 03:05 PM

to flash, CodePlex頁面上有個Souce Code的頁籤,看起來目前已有30次下載,應該有設定好開放權限了才對。或者你試試這個URL直接連接: http://bit.ly/aSL2h5

# Will 保哥 said on 01 September, 2010 04:50 AM

建議將授權的對象改成 IIS_WPG ( IIS5,6 ) 或 IIS_IUSRS ( IIS 7,7.5 )

# aliku said on 22 September, 2010 10:50 AM

此方式對承租的虛擬主機可行嗎?? 對虛擬主機的實體主機沒有權限直接操作. 所以這樣有解決方式嗎??  謝謝!!

# Jeffrey said on 22 September, 2010 04:36 PM

to aliku, 以上程式需要管理者權限在本機上執行,我想並不適用於Shared Web Hosting(只能透過FTP或Web UI部署程式的那種虛擬主機)... 除了用aspnet_regiis外,.NET 2.0+支援SectionInformation.ProtectSection()方法對web.config加密,只是承租的虛擬網站多半會調低ASP.NET程式的trust level,所以可能需要在section上加註requirePermission="false"。參考: http://bit.ly/alTTA0

# 不知我這樣子的想法對嗎 said on 09 December, 2010 03:40 AM

如果我用這個軟體加密後

其它人知道我用這樣子的方式加密, 就用這個軟體解密, 這樣子還是會被解開

請問要如何讓別人可以解密, 是否有辦法多加一個密碼參數到加密內, 讓要解開的人要知道我的密碼, 才有辦法解開

感謝

# Jeffrey said on 09 December, 2010 06:57 AM

to 不知我這樣子的想法對嗎, 如果被惡意人士取得登入IIS主機的權限,即便不用工具,也可以用aspnet_regiis解密。換句話說,一旦主機的管理權限被偷走,就失去了保護效力。我自己是在一些案子中用自己的演算法加密連線字串,再對web.config加密,等於上了兩層鎖,大致上的精神跟你的額外密碼參數差不多。

# 小巫 said on 27 December, 2010 07:10 PM

對於加密演算法的學習,不知「黑大」可否提供學習連結,

應該說如何習得這些演算法,並且變成自己的。

# John said on 12 January, 2011 08:51 PM

你好

這篇文章與Code又讓我學到了很多

小弟目前有個小案子,剛好客戶需要這樣的工具

請問板大同意讓我提供給客戶使用嗎?

(我會在保留UI上的作者..)

# Jeffrey said on 13 January, 2011 02:05 AM

to John, 這個工具我是以Open Source方式分享,歡迎隨意使用,不過因為你是要用在實務專案中,還是不免重提一下免責聲明: 我跟所有開源專案及部落格文章作者一樣,對於使用本站文章、範例程式或工具所可能造成的任何損失概不負責,風險的部分要自行評估與承擔就是了~~ (記得先備份會保險一些)

# John said on 13 January, 2011 02:32 AM

感謝板大的慷慨精神~

我會小心使用的

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

搜尋

Go

<August 2010>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234
 
RSS
【工商服務】
OrcsWeb: Windows Server Hosting
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication