2009年8月28日 星期五

SQL Server 2005 資料表架構訊息查詢

SELECT
TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END,
TableDesc=ISNULL(CASE WHEN C.column_id=1 THEN PTB.[value] END,N''),
Column_id=C.column_id,
ColumnName=C.name,
PrimaryKey=ISNULL(IDX.PrimaryKey,N''),
-- [IDENTITY]=CASE WHEN C.is_identity=1 THEN N'√'ELSE N'' END,
[IDENTITY]=CASE
WHEN C.is_identity=1
THEN N'IDENTITY ( '
+RTRIM(IDENT_SEED(O.name))
+N' , '
+RTRIM(IDENT_INCR(O.name))
+N' )'
ELSE N'' END,
Computed=CASE WHEN C.is_computed=1 THEN N'√'ELSE N'' END,
Type=T.name,
Length=C.max_length,
Precision=C.precision,
Scale=C.scale,
NullAble=CASE WHEN C.is_nullable=1 THEN N'√'ELSE N'' END,
[Default]=ISNULL(D.definition,N''),
ColumnDesc=ISNULL(PFD.[value],N''),
IndexName=ISNULL(IDX.IndexName,N''),
IndexSort=ISNULL(IDX.Sort,N''),
Create_Date=O.Create_Date,
Modify_Date=O.Modify_date
FROM sys.columns C
INNER JOIN sys.objects O
ON C.[object_id]=O.[object_id]
AND O.type='U'
AND O.is_ms_shipped=0
INNER JOIN sys.types T
ON C.user_type_id=T.user_type_id
LEFT JOIN sys.default_constraints D
ON C.[object_id]=D.parent_object_id
AND C.column_id=D.parent_column_id
AND C.default_object_id=D.[object_id]
LEFT JOIN sys.extended_properties PFD
ON PFD.class=1
AND C.[object_id]=PFD.major_id
AND C.column_id=PFD.minor_id
-- AND PFD.name='Caption' -- 字段說明對應的描述名稱(一個字段可以添加多個不同name的描述)
LEFT JOIN sys.extended_properties PTB
ON PTB.class=1
AND PTB.minor_id=0
AND C.[object_id]=PTB.major_id
-- AND PFD.name='Caption' -- 表說明對應的描述名稱(一個表可以添加多個不同name的描述)
LEFT JOIN -- 索引及主鍵訊息
(
SELECT
IDXC.[object_id],
IDXC.column_id,
Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'√'ELSE N'' END,
IndexName=IDX.Name
FROM sys.indexes IDX
INNER JOIN sys.index_columns IDXC
ON IDX.[object_id]=IDXC.[object_id]
AND IDX.index_id=IDXC.index_id
LEFT JOIN sys.key_constraints KC
ON IDX.[object_id]=KC.[parent_object_id]
AND IDX.index_id=KC.unique_index_id
INNER JOIN -- 對於一個列包含多個索引的情況,只顯示第1個索引訊息
(
SELECT [object_id], Column_id, index_id=MIN(index_id)
FROM sys.index_columns
GROUP BY [object_id], Column_id
) IDXCUQ
ON IDXC.[object_id]=IDXCUQ.[object_id]
AND IDXC.Column_id=IDXCUQ.Column_id
AND IDXC.index_id=IDXCUQ.index_id
) IDX
ON C.[object_id]=IDX.[object_id]
AND C.column_id=IDX.column_id
-- WHERE O.name=N'要查詢的表' -- 如果只查詢指定表,加上此條件
ORDER BY O.name,C.column_id

2009年8月5日 星期三

ASP.NET 2.0 筆記:加密組態檔

ASP.NET 2.0 筆記:加密組態檔

簡介

開發人員經常會在 web.config 中存放網站應用程式會用到的組態設定資料,例如:資料庫連線字串。其中有些可能是屬於比較機密的資料,需要使用加密的方式將這些資料加以保護,以免隨便就被別人看見。以往開發人員必須自己處理加密和解密的動作,現在 ASP.NET 2.0 提供了方便的加密和解密機制,讓我們可以很容易的將組態檔的某個區段 (section) 的內容加密。本文以一個簡單的實作範例來示範如何將 web.config 的內容加密,以及如何在程式中讀取加密過的組態設定。

準備工作

先在 Visual Studio 2005 中建立一個 Web Site,假設建立在 D:\Work\Demo\EncryptWebConfig。接著在 web.config 中加入 appSetting 設定,參考以下範例:










加密組態檔

加密的方法是利用 .NET Framework 提供的命令列工具:aspnet_regiis.exe。首先,開啟程式集 > Microsoft .NET Framework SDK v2.0 > SDK Command Prompt,接著輸入以下命令:
aspnet_regiis -pef appSettings D:\Work\Demo\EncryptWebConfig

aspnet_regiis 的 -pef 參數是用來加密某個絕對路徑下的 web.config 的某個 section,因此除了指定要加密的區段(此例為 appSettings),還要指定網站的絕對路徑 (此例為 D:\Work\Demo\EncryptWebConfig)。

如果加密成功,會出現以下訊息:

Encrypting configuration section...
Succeeded!

接著回到 Visual Studio 2005,檢視 web.config,原本的 元素的內容會變成類似下面這樣:


xmlns="http://www.w3.org/2001/04/xmlenc#">





Rsa Key


z90mHvF2ckJWcNn(略...)




IGp7RWwbBkY2M2Bz5izbs(略...)





這樣就完成加密的工作了。接下來看看如何在程式中讀取加密過的資料。

在程式中讀取加密過的組態

在程式中讀取加密過的組態設定資料,程式撰寫方式跟平常一樣。例如:
string s = ConfigurationManager.AppSettings["mySecret"];

我們完全不需要自行撰寫解密的程式碼,因為 .NET Framework 類別已經在背後幫我們自動處理掉解密的工作了。

解密組態檔

如果要將之前加密過的組態檔內容還原成加密之前的資料,可以使用 aspnet_regiis -pdf 命令,例如:
aspnet_regiis -pdf appSettings D:\Work\Demo\EncryptWebConfig

此外,你可以重複執行同一個加密或解密的命令。對一個加密過的區段再次加密,只會將原始資料重新加密,而不會將加密後的資料再重複加密一次;而對一個解密過的資料重複進行解密動作,也不會有任何影響。

aspnet_regiis 的其他加密參數

-pe 與 -pd 參數

在前面的簡單示範中,筆者使用的是 -pef 參數,此參數必須指定一個加密的區段名稱,以及要加密的網站的絕對路徑。你還可以使用 -pe 參數來加密組態檔,使用此參數時,通常會搭配 -app 參數來指定虛擬目錄的名稱,例如:

aspnet_regiis -pe appSettings -app /MyWeb

如果 -app 之後所指定的虛擬目錄是 '/',則會加密 IIS 網站的根目錄底下的 web.config。如果你沒有指定 -app 參數,那就會加密 .NET Framework 安裝目錄下的 CONFIG\web.config。

與 -pe 參數對應的解密參數就是 -pd,用法與 -pe 參數相同。

-prov 參數

在前面的範例當中,加密後的 appSettings 元素有一個 configProtectionProvider 屬性:


這個屬性的用途是指定加密的提供者,從它的屬性值可以看出,這個提供者所使用的加密演算法是 RSA。你也可以使用 -prov 參數來指定使用其他的提供者,例如 DPAPI (Data Protection Application Programming Interface) ,參考以下範例:
aspnet_regiis -pef appSettings D:\Work\Demo\EncryptWebConfig -prov DataProtectionConfigurationProvider

使用 DPAPI 加密後的組態檔內容如下:





AQAAANCMnd8BF(略...)







若沒有指定 -prov 參數,預設就會使用 RSA 進行加密。

結語

本文簡單介紹了 ASP.NET 2.0 加密 web.config 的方法,以往開發人員必須自行撰寫加密解密的程式碼,現在只要使用 aspnet_regiis 這個命令列工具,執行一行命令就完成加密動作了。更棒的是,在程式中讀取加密過的資料完全不需要撰寫額外的程式碼,這些解密的過程都由 .NET Framework 類別幫我們在背後處理掉了。
另外,本文也提到了 RSA 和 DPAPI 兩種加密方式。根據 MSDN 文件的說明,如果你的網站會部署到多台伺服器上面以同時服務不同的用戶端,也就所謂的 Web farm 架構,那麼你應該要採用 RSA 的加密方式,因為這種方式可以讓你很容易的在多台伺服器之間匯出和匯入 RSA 金鑰(所有 Web farm 機器都要用同一把鑰匙,否則解密會有問題),若用 DPAPI 則很難確保所有機器都用同一把鑰匙。如果想要進一步了解 RSA 加密的應用,以及其他跟組態檔加密有關的議題,可以參考以下文章:

MSDN 文章:Encrypting Configuration Information Using Protected Configuration (http://msdn2.microsoft.com/en-us/library/53tyfkaw(en-US,VS.80).aspx)
MSDN 文章:How To: Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/paght000005.asp) by J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Andy Wigley. Microsoft Corporation. July 2005
MSDN 文章:How To: Encrypt Configuration Sections in ASP.NET 2.0 Using RSA (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/paght000006.asp)by J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Andy Wigley. Microsoft Corporation. July 2005
Create Export & Encrypt connection string on server and dev machine with ASP.Net 2.0 (http://aspdot.net/articles/encryptedconnstring/)Published 2006年5月9日 上午 12:33 by huanlin
Filed Under: ASP.NET


文章出處

如何加密 Web.config 中的 connectionStrings

2008/06/20


程式筆記本 - 如何加密 Web.config 中的 connectionStrings
1.隨便找個 web.config,放到要做 encryption 的電腦上,假設放在C:\Inetpub\wwwroot\XXX
2.打開command 視窗,執行CD\WINDOWS\Microsoft.NET\Framework\v2.0.50727
3.執行aspnet_regiis -pef connectionStrings C:\Inetpub\wwwroot\XXX
4.在成功執行 encryption 後,根據 Windows 版本執行以下的指令:
  Windows 2003:
  aspnet_regiis -pa "NetFrameworkConfigurationKey" "Network Service"

  Windows 2000 / XP:
  aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
5.成功後照第3步為真正要加密的web.config做加密
6.要解密的話,把參數 -pef 改成 -pdf 就可以了
ps1:3、4在各別電腦上應只需執行一次,目的只是讓IIS能讀到key
ps2:如果是app.config的話,先把檔名改為web.config,加密完再改回來即可


-------------------------------------------------------------------------------
Web.config Encryption
張貼者: 杜B 標籤: 經驗之談 27 October 2007 又是一個 quick note,.NET Framework 2.0 已經內建 web.config 的 encryption,而且不用更改任何 source code。做法如下:

1. 隨便找個 web.config,放到要做 encryption 的電腦上

2. 執行 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis -pef connectionStrings C:\Inetpub\wwwroot\XXX
(會自動找 web.config,XXX 是你在第一步找來的「隨便 web.config」)

3. 在成功執行一次 encryption 後,根據 Windows 版本執行以下的指令:
Windows 2003:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis -pa "NetFrameworkConfigurationKey" "Network Service"

Windows 2000 / XP:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"

4. 最後再如常執行第二步的指令,正式替 web.config 做 encryption。

5. 完成後 .NET Web App 會自動在 runtime 做 decryption,唯注意 encryption 需在執行該 web app 的電腦上執行,即不可以預先在 development machine 做好才放到 production machine。

--
注意:


次序必需正確,否則 encrypt 之後未必能 decrypt
要 decrypt 的話,把參數 -pef 改成 -pdf 就可以了