3.29.2006

About System.Security.SecureString

SecureString的特性很迷人,在記憶體裡是加密的字串,可以Dispose掉,不會在CLR下很輕易的被反組譯。

詳細特性可以看http://msdn2.microsoft.com/en-us/library/7kt014s1.aspx,或是在MSDN裡找到。在應用上的特點你可以看MSDN Magazine裡的資料,http://msdn.microsoft.com/msdnmag/issues/06/00/SecurityBriefs/default.aspx,裡面提到的安全性加強真是令人血脈僨張。

不過,當你看到MSDN也好,MSDN Maganize也好,都沒有相關的範例,怎麼辦。好吧!向Google大神求助吧!
http://blogs.msdn.com/shawnfa/archive/2004/05/27/143254.aspx
shawnfa的Blog算是最清晰的一個了,有教你怎麼把該加密的字串送進去,有教你怎麼把他從記憶體裡清掉。

但是那怎麼把字串弄出來送到Connection.ConnectionString呢?

這裡就是我試出來的答案,不過還是有疑慮,那ConnectionString安全嗎?在轉出到ConnectionString的期間,安全嗎?我不知道,這兩天會找找答案在哪裡。

//Insert String into SecureString in Constructor, I dont try this
SecureString password = new SecureString(char[],length);

//Append String into SecureString
foreach(char c in s) {
SecureString.AppendChar(c);
}

//GetString, Apply, And Dispose
void RunXX(){
IntPtr ptr = Marshal.SecureStringToBSTR(SecureConnectionString);(*1)
try {
SqlConnection conn = new SqlConnection();
conn.ConnectionString = Marshal.PtrToStringBSTR(ptr);(*2)
conn.Open();
... Run Query or something....
} finally {
Marshal.ZeroFreeBSTR(ptr);(*3)
}
}

以下是我的想法啦,畢竟對於Unmanage Code的使用真的不太熟,請盡量糾正錯誤,不要客氣。

*1: 這裡算是把SecureString的資料解到一個Unmanage的指標下。
*2: 把Unmanage的字串解到Connection的ConnectionString裡,就是這裡有安全性疑慮。
*3: 最後要把放在Unmanage的指標字串清掉,就沒人能反組譯到了。

1 comment:

MapleStory Gold said...

Genuinely i comprehend the effort you've made to share the knowledge.This issue here i found was actually effective to the topic that i has been researching for a long period
Cheap Diablo 3 Items

cheap diablo 3 Gold