ShowProgramCode

2021年9月7日 星期二

C# ASP.NET web.config的RSA加密

 通常我們會在web.config中放入很多設定值,其中不乏帳密之類的機密資料。按理說,這支檔案是無法被截取的,不過為了安全起見,倘若可以做更多加密處理,也能更加放心。

這次客戶提供的web.config就有加密處理,並且因為沒有RSA Key的原因,整個程式無法順利編譯。因此我將這個RSA加密web.config的方式記錄下來。

使用RAS Key加密,必須用到Visual Studio的一個執行檔(aspnet_regiis.exe),所以必須將cmd用管理者權限執行後,將路徑移動到那個執行檔的資料夾。

C:\Windows\Microsoft.NET\Framework\v4.0.30319,這是我使用的資料夾。

在HelloWorld中加上讀取appSettings的內容,確認加密前後程式可以正常編譯。



















[WebMethod]

public string HelloWorld()

{

    string temp = ConfigurationManager.AppSettings["test"];

    return temp;

}


一、以本機的RSA Key加解密:

這個方法比較簡單,不過一旦將檔案移到別的主機上,就會發生最前面所述,整個程式無法編譯的問題,所以自己玩一下可以,並不是那麼實用。

加密:

1.在命令列執行aspnet_regiis.exe -pef appSettings "專案的web.config所在資料夾"

以本機RAS Key加密





2.確認web.config加密後內容

web.config加密後內容
















3.編譯執行程式,看看是否可以順利讀到appSettings內容

解密:

1.在命令列執行aspnet_regiis.exe -pdf appSettings "專案的web.config所在資料夾"

以本機RAS Key解密






2.確認web.config是否解密還原最初的內容

二、以固定的RSA Key加解密

1.確認使用本機或是取得其他RSA Key加密

    1.1使用本機的RSA Key加解密

    這應該是最常見的狀態,使用本機的RSA Key加密後,提供這把Key給其他使用者。

aspnet_regiis.exe關於說明建立RSA Key說明


參考上述的說明內容,在命令列執行aspnet_regiis.exe -pc "金鑰名稱" -exp,如下圖。

在命令列執行建立RSA金鑰







之後修改專案的web.config內容,加入一段設定指定金鑰加密的部分。

<configProtectedData>

    <providers>

      <add name="RuitingtechProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0,  Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" keyContainerName="金鑰名稱" useMachineContainer="true"/>

    </providers>

  </configProtectedData>

web.config設定特定RSA金鑰加密





在命令列輸入加密命令,aspnet_regiis.exe -pef 加密區段 "web.config資料夾路徑" -prov "RuitingtechProvider"

在命令列輸入使用特定RSA金鑰對web.config特定區域加密




web.config加密後內容


















   
    1.2使用其他裝置密鑰加密
    這邊就不特別實作,大致應該是把金鑰檔匯入本機中,其他的動作應該是差不多的。

確認加密後程式可以正常編譯、執行。

2.確認使用本機或取得其他RSA Key解密
    2.1使用本機特定金鑰解密
    在命令列輸入解密命令,aspnet_regiis.exe -pdf 解密區域 "web.config所在資料夾路徑"
在命令列輸入解密命令









    web.config恢復未加密內容。

    2.2使用其他裝置密鑰解密
    這邊不特別實作,先將金鑰匯入本機中,其他動作應該是差不多的。
將其他裝置金鑰的xml匯入命令參考







3.將RSA Key匯出xml檔案給其他裝置使用
aspnet_regiis.exe -px “金鑰名稱” 金鑰xml路徑 -pri
在命令列輸入匯出xml檔案命令








尋找一下這個位置是否產生了xml的金鑰檔案。



最後補充一下刪除金鑰容器的說明。
 aspnet_regiis -pz "金鑰名稱"




參考網頁:
https://dotblogs.com.tw/wasichris/2016/01/01/235040
https://www.itread01.com/content/1549832402.html
以及C# Asp.Net官方文件


2021年9月1日 星期三

C# ASP.NET的DEBUG模式下執行特定程式

 今天把程式放上IIS後,居然出現在本機測試沒有出現的Error。去查了LOG,回到程式碼查看後,發現程式跑了一段我在本機處理時不曾跑過的函式,函式中需要驗證的機器因為沒有設定,所以才出現了Error。

但是為什麼在本機測試時,一直沒有出現這樣的錯誤呢?

程式中出現了下面的內容,於是我上網去查了C#的說明。

#if(!DEBUG)

.......

#endif

直接先說結論,這段程式的意思大致是,程式在非Debug模式下執行,會進入裡面的內容。而我在本機一直是用Debug模式在執行程式,所以才沒有發現這個問題。

這其實是個好用的設定,偶爾我們需要在Debug的模式下特別紀錄某些LOG或者特別執行某些程式來做測試,利用這個的功能就可以不調整程式的前提下,將一般模式與Debug模式分開處理。

要如何設定這個功能呢?

首先,在web.config中確認<compilation debug="true"/>這個設定是正確的。

接著關於如何判斷是否在Debug模式下,則有兩種做法。

1.如上方所述,利用#if(DEBUG)判斷:

將所有要在DEBUG模式下執行的程式,放在#if(DEBUG)與#endif之間即可,比較直觀,但是之後修改不易,可能讓程式中佈滿相關的if。一旦要修改也很難找到正確的修改位置。

2.利用 ConditionalAttribute 屬性來判斷:

這部分我目前尚未實測過,不過相較之下看起來比較容易將相關的程式放在一起,之後維護起來也比較方便。

在DEBUG模式下要處理的函式加上[Conditional("DEBUG")]即可,參考如下。

[Conditional("DEBUG")]
Public void DebugLog()
{
......
}

日後有需要我應該會採用第二種做法,有時間也可能做個測試程式。

參考網頁如下:
https://dotblogs.com.tw/joysdw12/2014/03/14/asp-net-debug-release-if-else-conditional