安全的基礎知識
在高度保證企業應用程序安全的過程中我們不免會考慮到如下的安全需求,然後我們針對這些安全需求提出各種安全技術:
1、完整性驗證(IntegrityVerification)。也就是以防止我們需要的內容不被篡改。
2、機密性保持(ConfidentialityPreservation)。通俗的說就是防止內容被別人讀懂。
3、認證和訪問授權(AuthenticityPermission)。通俗的說就是對來訪者提供的信息進行分析和判斷,從而確定來訪者身份,然後根據身份決定該來訪者具有什麼權限。
4、不可抵賴的證據(NonrepudiationEvidence)。舉個很簡單的例子,如果你去銀行交費,銀行必須該你一個交過費的憑證,不然被別人私通怎麼辦?題外話:如果我們的銀行弄假的話,我們肯定被欺無疑^^。
5、審計證據(AuditingEvidence)。對一些安全性十分重要的數據操作進行紀錄和觀察,相當於銀行的那個攝像頭,在需要的時候他們的作用你就知道。
針對上面提到的需求列表對各個技術進行比較粗略地介紹。詳細內容請從email:[email protected]獲取。
加密技術(包括防止篡改技術)
加密技術是其它安全服務技術的基礎,其他安全穿插使用相當廣泛。所以在學習軟件安全技術之前了解各種加密技術是相當重要的。
加密技術的分類
消息摘要主要用於保持數據的完整性,我們經常聽到的校驗和就是消息摘要的一個特例。它的算法是一個單項函數。也就是直接將輸入的數據進行消息摘要提取,但絕不能從消息摘要生成原數據。消息摘要的算法分為如下幾類(最常用的是MD5和SHA-1):
我們可能經常會疑問,我們有了消息摘要為什麼還要認證碼呢?聽我給你舉個例子,前面提到的消息摘要的算法可以確保消息摘要和具體的消息之間的一一對應,也就是只要你有相同的消息,采用相同的算法肯定能產生相同的消息摘要,但有時為了特殊的目的我們需要只有特定的人才能生成這個摘要,這時候我們可以通過在生成消息摘要的過程中加入相應的密鑰,從而使生成的消息摘要在沒有密鑰的情況下難以生成。
鑒於消息摘要的一一對應,經常在一些保護用戶密碼的地方我們采用了這種算法。例如,在銀行系統,為了不讓管理數據庫的員工把你的密碼看到,系統本身在你的密碼存入庫中之前就做了消息摘要的提取,這樣庫中別人看到的是一串奇怪的串,他也沒法逆向獲得你的明文密碼。當然,如果銀行的安全系統被控制,那什麼事情都可以做。
對稱密鑰應該是相當強壯的信息加密算法。這和我們生活中的鑰匙極為相像。例如你家的門鎖可以有好幾把鑰匙,並且這些鑰匙都相同。在現實生活中,你可以將做好的鑰匙手遞手交給你的親人,指要有了鑰匙,你就可以打開你家的門。我們經常登陸網站用的用戶名和密碼的原理就是這樣的。但密碼等在網絡傳輸中很容易被竊聽和截取,為了確保傳輸安全我們必須和後面提到的傳輸相關的加密算法配合進行,例如我們在登陸時使用https。下面是一些最普通的對稱密鑰算法:
我們在介紹對稱密鑰的時候舉了一個例子,提到了密鑰傳輸的安全問題。並且在網絡中的傳輸雙方並不是我們現實中的“親人”關系,為了達到雙方的信任和安全,我們需要尋找一種機制,那麼公鑰正好解決了這個問題。我這裡舉個通俗的例子,例如你有個信箱(物理信箱),開著一個縫隙(公鑰),大家都能往裡塞東西,但是一旦塞進取,那可不是大家都能取到的,只有擁有信箱鑰匙(私鑰)才能得到。哈哈!就這樣。公鑰就這樣,不要擔心它多難理解。當然當我們反過來理解的時候就有些和信箱不同的地方。也就是用私鑰加密的東西只有對應的公鑰才能進行解密,這種算法經常被應用在數字簽名上。其實在現實中你可以將公鑰技術和私鑰技術結合起來完成信息保密,因為公鑰的計算速度相當慢,比私鑰慢大約100-1000倍。下面是一些非對稱密鑰算法列表:
需要注意的是私鑰和密鑰是成對的,並且不能用一個生成另外一個,特別是不能用公鑰生成私鑰,否則就麻煩了。
認證和不可抵賴
我們經常在論壇中中見到管理員、斑竹等身份標識,並且我們更明白擁有不同的身份它們的權限也同樣有差別。但我們很想擁有管理員的權限,我們的突破口應該在哪裡呢?當然是獲得一個管理員的賬號,這樣就可以被系統的認證系統識別。通俗的說就是要讓系統的認證識別器確認你是管理員身份就可以了。呵呵,沒那麼容易,因為各個系統都具有嚴密的認證體系,不象一些小朋友做的認證邏輯處在sql溢出邏輯上那麼簡單。
認證的實現方法多種多樣,真的,我以前做網站的時候總是想當然地進行用戶認證。但其基礎技術有如下列表:
下面就分別將這些認證做一介紹:
太熟悉了,不是嗎?這裡只很想告訴口令暴露的過程以及保護的過程。我們通常見到的口令認證方式是在傳輸過程中口令完全暴露,並且在服務器端的口令存儲上也完全是明文的形式,造成的後果是口令完全被暴露,很容易被監聽或者在數據庫裡讀取。那麼如何保護這些過程中的口令呢?暫時的思路是:建立在安全傳輸層的基礎上,內部口令不以明文形式出現。好了,不多說了,需要了解更詳細的內容請發郵件到:[email protected]。
功能我們不用說,當然是非常強大,但代價昂貴。你見過這樣的認證嗎?呵呵,很少的話,就了解一下就行了,要更多了解勸你先研究一下ATM機和ATM卡或者給我發郵件:[email protected]。
想想就知道了,你的指紋、眼睛視網膜等可真是獨一無二啊。呵呵,其復雜性也是很大的。我都部知道^^,當然你可以知道,別忘了告訴我[email protected]。
近年來相當流行的認證技術是基於證書的認證。證書的概念和我們現實中的畢業證書、學位證書等差不多。上面可以記載一些事實信息(特別是某一實體),那當然差別主要體現在數字技術的特殊需要上。其實證書就是一個數據塊,主要包括公開密鑰、主體相關的信息、證書有效的日期、證書發行者的信息和證書發行者生成的簽名。
不是“親人”那我們就得搞清楚對方是什麼?不然的話,我們怎麼能把“她”的東西拿來用呢?或者怎麼能把咱們的東西給“她”呢?“她”得拿出個什麼憑據吧?呵呵,那當然。這無可非議,可能現在你更急切的就是想知道這個證書的簽發和應用過程吧?好了。我們繼續。
我們前面已經談過將公鑰技術反過來可以應用於數字簽名。但數字簽名誰都可以做,數字簽名僅僅能解決你是誰,但並不能說明該主人就是一個多麼“可愛和友好”的家伙,例如3721經常偷偷的忘我的機器裡裝東西,我很煩。但我倒有個主意,我們去找一個特別了解此人的人(當然要權威了)問問看此人是否信得過,或者看看此人是否由大名鼎鼎的那個官員擔保。哈哈,就是這樣,我們經常說的CA機構就是干這事情的。爽!那麼整個過程如何呢?
其實整個過程很簡單,就認為是二次數字簽名就是了。第一次首先需要證書的實體將自己的信息和公鑰提交給CA,CA確認該組織的可信賴之後,就用自己的密鑰對該實體的信息和公鑰進行簽名。最後被簽名的信息就叫證書(當然沒有CA擔保簽名的證書也是證書,但那只是自己給自己發)。站在用戶的角度,用戶首先接到一個證書,當然會根據CA(可信)提供的公鑰進行解密,如果能解密,當然就可以獲得可信賴的信息和實體公鑰,但前提是你已經有你信賴的CA的公鑰,你如果是Windows你可以直接升級你的證書公鑰庫。然後由實體公鑰再進行前面我們介紹的數字簽名解密步驟。呵呵,就這樣。
安全套接字層
安全套接字層(SSL)和取代它的傳輸層安全性(TLS)是用於在客戶機和服務器之間構建安全的通信通道的協議。它也用來客戶機認證服務器(不太常用的),當經常用來服務器認證客戶機。該協議在浏覽器應用程序中比較常見,當浏覽https://...時,浏覽器窗口底部的鎖表明SSL/TLS有效。
TLS1.0和SSL3.1一樣。
SSL/TLS使用本教程中已經討論過的三種密碼術構件的混合體,但這一切都是對用戶透明的(也就是系統幫你做了所有)。以下是該協議的簡化版本:
?當使用SSL/TLS(通常使用https://URL)向站點進行請求時,從服務器向客戶機發送一個證書。客戶機使用已安裝的公共CA證書通過這個證書驗證服務器的身份,然後檢查IP名稱(機器名)與客戶機連接的機器是否匹配。
?客戶機生成一些可以用來生成對話的私鑰(稱為會話密鑰)的隨機信息,然後用服務器的公鑰對它加密並將它發送到服務器。服務器用自己的私鑰解密消息,然後用該隨機信息派生出和客戶機一樣的私有會話密鑰。通常在這個階段使用RSA公鑰算法。
?然後,客戶機和服務器使用私有會話密鑰和私鑰算法(通常是RC4)進行通信。使用另一個密鑰的消息認證碼來確保消息的完整性。
本文完畢,有什麼建議,請給我來信[email protected]