iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 15
2
Security

資料安全與簡單加密演算法見面會 系列 第 15

[Day15] 資料使用安全(保護連接字串)下

接續昨天的連接字串(connectionstring)保護,無論是加密連接字串或是從其他安全機制取得密碼,免不了都要修改DAL(Data Access Layer)資料存取層的程式,江湖傳說懶是工程師的美德,有著神祕推著人類進步的力量,那麼這樣的美德我們.NET工程師能不能培養?

哈!有的! ASP.NET有的支援!

  • 使用ASP.NET IIS註冊工具(Aspnet_regiis.exe),我們可以指定加密或解密Web組態檔的區段。
  • 當處理.NET讀取 Web.config 檔案時,ASP.NET 也會自動解密已加密的組態項目。

我們來試試無痛加密升級。

組態檔案加密:


我們來試試看加密組態檔案中的connectionStrings區段

http://ithelp.ithome.com.tw/upload/images/20161230/20103434NVEc9uDuhG.png

啟動開發人員命令提示字元

Windows + Q + 輸入VS 2015 > 滑鼠滑到開發人員命令提示字元 > 右鍵系統人員執行

http://ithelp.ithome.com.tw/upload/images/20161230/20103434B12lJagDOs.png

把web.config放在指定目錄下,假設我們放在E:\Test\Web,然後執行以下Command加密:

aspnet_regiis -pef "connectionStrings" "E:\test\web" -prov "RsaProtectedConfigurationProvider"

http://ithelp.ithome.com.tw/upload/images/20161230/2010343477kPT10K8q.png

加密後的連線字串

http://ithelp.ithome.com.tw/upload/images/20161230/20103434TJ4B0xgxPU.png

執行以下Command設定儲存加密金鑰容器的權限

金鑰容器權限
aspnet_regiis -pa "NetFrameworkConfigurationKey" "stanleyjui"

預設金鑰容器名稱是NetFrameworkConfigurationKey

http://ithelp.ithome.com.tw/upload/images/20161230/20103434xmhytwy69j.png

試試看從.NET程式取得連接字串

[TestMethod]
public void TestSqlConnectionStringFromConfigEncrypted()
{
    //簡單連線資料庫查詢SQL Server版本資料
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ironman"].ConnectionString))
    {
        Console.WriteLine(conn.ConnectionString);
    }
}

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161230/20103434VqWhSpKoIk.png
果然自動解密!

組態檔案解密:


執行以下Command進行組態檔案解密

aspnet_regiis -pdf "connectionStrings" "E:\test\web"

組態檔案順利解開!
http://ithelp.ithome.com.tw/upload/images/20161230/20103434zlMXmZ9cV3.png

選擇演算法


  • DpapiProtectedConfigurationProvider. 使用 Windows Data Protection API (DPAPI) 加密和解密資料,使用3DES加密演算法。
  • RsaProtectedConfigurationProvider 使用 RSA 加密演算法加密和解密資料。
    不過,只有RSA才能匯出金鑰到其他伺服器使用。

PersistSecurityInfo


如果希望與SQL連線建立後,迅速清除記憶體中連接字串的密碼資訊,記得不要把PersistSecurityInfo設定成True
PersistSecurityInfo預設是false,SqlConnection.open()後就會清除密碼資訊了。
sqlsb.PersistSecurityInfo = false;

ASP.NET IIS 註冊工具是否支援app.config加解密


可以的,但我們得先把app.config改名成web.config,加密後再rename回app.config。

其他


設定加密時如果出現以下訊息:

無法使用提供者 'RsaProtectedConfigurationProvider' 加密區段 'connectionStrings'。來自這個提供者的錯誤訊息為: 物件已存在。

可以注意我們是否以管理員身份執行。

AP執行時,如果出現:

無法開啟RSA金鑰容器訊息

可以注意是否有將RSA金鑰容器權限賦予執行帳號。

這兩天我們實作了安全的組態管理,設法保護了組態檔案內的連接字串,確保經過授權後的應用程式(AP),才能取得資料庫內的資訊,同時也讓重要的密碼資訊,確保只有持有金鑰的執行程式才能取出

參考


匯出加密金鑰
https://msdn.microsoft.com/zh-tw/library/2w117ede(v=vs.100).aspx#匯出及匯入 RSA 金鑰容器

組態檔案加密
https://msdn.microsoft.com/zh-tw/library/zhhddkxy(v=vs.100).aspx

組態檔案加密
https://dotblogs.com.tw/huanlin/2008/04/23/3226


托斯卡尼警車
http://ithelp.ithome.com.tw/upload/images/20161230/201034340P5DrMv8iN.jpg
2011.10攝於Toscana,Italy


上一篇
[Day14] 資料使用安全(保護連接字串)上
下一篇
[Day16] 資料使用安全(應用程式弱點)
系列文
資料安全與簡單加密演算法見面會 30

尚未有邦友留言

立即登入留言