|
我們程序的威脅來自于各個方面.在互聯(lián)網(wǎng)高度發(fā)達的今天, 安全性問題已經(jīng)是企業(yè)軟件開發(fā)所必須面對的最重要的問題. 從安全學(xué)的一般意義上來講,安全性主要體現(xiàn)在兩個方面:
- 敏感數(shù)據(jù)的泄露
- 敏感數(shù)據(jù)的破壞
從具體上來說, .NET 元數(shù)據(jù)機制的設(shè)計, 既方便了反射等強大特性的實現(xiàn), 又同時給代碼安全及程序運行時安全帶來了巨大的隱患.迄今為止, 還未發(fā)現(xiàn)比較有效元數(shù)據(jù)可見性控制方法. 當(dāng)然, 這不在本文的討論范圍之內(nèi). 我還是更愿意在這篇文章在針對.NET的內(nèi)存分配機制討論一個更具體的問題: 如何保護在內(nèi)存中存儲的敏感數(shù)據(jù)?
String的駐留機制帶來的安全性問題
String是代碼中使用頻率很高的對象類型. 為了提高字符串的處理速度, 節(jié)省內(nèi)存空間, Microsoft為.NET String類設(shè)計了駐留機制. 其大概的邏輯模型是, 大部分String存儲在一個類似的Hash Table中, string的內(nèi)容是哈希表的key, 該key對應(yīng)的value是string的內(nèi)存地址. 這樣內(nèi)容相同的string實際上只是對應(yīng)內(nèi)存堆上同一個字符串.之所以說是大部分而不是全部, 是因為有一部分動態(tài)創(chuàng)建(concat)的string, 是不會進入這樣一個虛擬的hash Table中的. 本文的最后附上String類的源代碼, 有興趣的同學(xué)可以研究研究:D
這就帶來了最主要的問題, 你無法準(zhǔn)確控制或者預(yù)測一個特定字符串的生命周期. 一個以string形式呈現(xiàn)的敏感數(shù)據(jù)(比如密碼)很有可能在內(nèi)存中一直存在, 而你卻預(yù)測它在超出某個特定函數(shù)的作用域的時候就被垃圾回收了. 這樣, 當(dāng)發(fā)生操作系統(tǒng)換頁的時候(而這也往往是可能發(fā)生的), 這個敏感數(shù)據(jù)就被保存到本地文件pagefile.sys當(dāng)中, 或者當(dāng)操作系統(tǒng)休眠的時候, 敏感數(shù)據(jù)進入hiberfil.sys中.一個可能的敏感數(shù)據(jù)泄漏過程是:
使用SecureString類
現(xiàn)在既然String靠不住了,我們能有什么簡單的方法來特別的保護我的敏感數(shù)據(jù)嗎? 幸運的是, .NET從Version 2.0開始, 為我們提供了一套基于DPAPI的解決方法 - SecureString.
SecureString類具有以下特性:
SecureString中的內(nèi)容是加密之后的,而不是平文;
使用windows的加密方案DPAPI ;
SecureString只能在基于NT的平臺上使用
C#代碼示例
NET技術(shù):.NET : 如何保護內(nèi)存中的敏感數(shù)據(jù)?,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。