其實微軟有個基本的加密機制可以運用,我這樣拿來搭配一個應用程式:
- 部署到客戶端時,設定檔內的連線字串還是明文。
- 在用戶端第一次執行,最開始的程式會檢查設定檔,如果是明文則加密。
- 其後每一次執行,最開始的程式仍然會檢查設定檔,如果已加密則不變。
- 後續的程式會用到設定檔內容,透過 ConfigurationManager 其實不用為解密煩惱。
- 萬一要更改設定,從另一個未加密的「範本設定檔」開始。
ConnectionStringsSection css = // 取得連線字串段落
css.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
引號內的部份是什麼意思?查了半天,總算在 machine.config 得到線索:
<configuration>
<configProtectedData>
<providers>
<add name="RSAProtectedConfigurationProvider" keyContainerName="NetFrameworkConfigurationKey"...
這是一把可用來加解密的金鑰,它可透過以下的命令匯出:
aspnet_regiis -px NetFrameworkConfigurationKey C:\out.xml -pri
但這會有個小問題,「機碼用在特定狀態時無效」,這是什麼?先放著,試試以下這個:
aspnet_regiis -px NetFrameworkConfigurationKey C:\out.xml
就不會有問題。到此學到了一些事:
- 系統內可以有很多金鑰,在預設情況下,一把名為「NetFrameworkConfigurationKey」的金鑰可用來加密設定檔。
- 這把金鑰是「不可匯出私鑰」的,只是錯誤訊息太糟了。
aspnet_regiis -pz NetFrameworkConfigurationKey
aspnet_regiis -pc NetFrameworkConfigurationKey -exp
aspnet_regiis -px NetFrameworkConfigurationKey C:\out.xml -pri
將 out.xml 移到另一部機器上:
[Computer2] aspnet_regiis -pi NetFrameworkConfigurationKey C:\out.xml
果然是可用的。
沒有留言:
張貼留言