互聯(lián)網(wǎng)世界簽名
數(shù)字簽名
類似在紙質(zhì)合同上簽名確認(rèn)合同內(nèi)容,數(shù)字簽名用于證實(shí)某數(shù)字內(nèi)容的完整性(integrity)和來源(或不可抵賴,non-repudiation)。
實(shí)際應(yīng)用中,由于直接對原消息進(jìn)行簽名有安全性問題,而且原消息往往比較大,直接使用RSA算法進(jìn)行簽名速度會比較慢,所以我們一般對消息計(jì)算其摘要(使用SHA-256等安全的摘要算法),然后對摘要進(jìn)行簽名。只要使用的摘要算法是安全的(MD5、SHA-1已經(jīng)不安全了),那么這種方式的數(shù)字簽名就是安全的。
數(shù)字摘要
顧名思義,數(shù)字摘要是對數(shù)字內(nèi)容進(jìn)行 Hash 運(yùn)算,獲取唯一的摘要值來指代原始數(shù)字內(nèi)容。 數(shù)字摘要是解決確保內(nèi)容沒被篡改過的問題(利用 Hash 函數(shù)的抗碰撞性特點(diǎn))。數(shù)字摘要是 Hash 算法最重要的一個用途。在網(wǎng)絡(luò)上下載軟件或文件時,往往同時會提供一個 數(shù)字摘要值,用戶下載下來原始文件可以自行進(jìn)行計(jì)算,并同提供的摘要值進(jìn)行比對,以確 保內(nèi)容沒有被修改過。
看一個具體場景:
1,小明對外發(fā)布公鑰,并聲稱對應(yīng)的私鑰在自己手上
2,小明對消息M計(jì)算摘要,得到摘要D(digest)
3,小明使用私鑰對D進(jìn)行簽名,得到簽名S(signature)
4,小明將M和S一起發(fā)送出去
接收方,驗(yàn)證過程如下:
1,接收者先對消息M使用跟小明一樣的摘要計(jì)算方法,得到摘要D‘
2,使用小明的公鑰對S進(jìn)行解簽,得到摘要D
3,如果D和D’相同,那么證明M確實(shí)是小明發(fā)出的,并且沒有被篡改過
數(shù)字證書
數(shù)字證書用來證明某個公鑰是誰的,并且內(nèi)容是正確的。
對于非對稱加密算法和數(shù)字簽名來說,很重要的一點(diǎn)就是公鑰的分發(fā)。一旦公鑰被人替換(典型的如中間人攻擊),則整個安全體系將被破壞掉。
怎么確保一個公鑰確實(shí)是某個人的原始公鑰?
這就需要數(shù)字證書機(jī)制。
顧名思義,數(shù)字證書就是像一個證書一樣,證明信息的合法性。由證書認(rèn)證機(jī)構(gòu)(Certification Authority,CA)來簽發(fā),權(quán)威的 CA 包括 verisign 等。
數(shù)字證書內(nèi)容可能包括版本、序列號、簽名算法類型、簽發(fā)者信息、有效期、被簽發(fā)人、簽發(fā)的公開密鑰、CA 數(shù)字簽名、其它信息等等,一般使用最廣泛的標(biāo)準(zhǔn)為 ITU 和 ISO 聯(lián)合制定的 X.509 規(guī)范。
其中,最重要的包括 簽發(fā)的公開密鑰、CA 數(shù)字簽名 兩個信息。因此,只要通過這個證書就能證明某個公鑰是合法的,因?yàn)閹в?CA 的數(shù)字簽名。
接著上次的應(yīng)用場景做假設(shè):
1,現(xiàn)在有第三者小紅,小紅想欺騙接收者,她偷偷使用了接收者的電腦,用自己的公鑰換走了小明的公鑰
2,此時接收者實(shí)際擁有的是小紅的公鑰,但是還以為是小明的公鑰,因此,小紅就可以冒充小明,用自己的 私鑰做成“數(shù)字簽名”,發(fā)消息給接收者,讓接收者用假的小明公鑰進(jìn)行解密
3,后來,接收者感覺不對勁,發(fā)現(xiàn)自己無法確定公鑰是否真的屬于小明。他想到了一個辦法,要求小明去“證書中心”(Certification authority, CA),為公鑰做認(rèn)證。
4,證書中心用自己的私鑰,對小明的公鑰和一些相關(guān)信息一起加密,生成數(shù)字證書(Digital Certificate),小明再發(fā)消息,只要在簽名的同事,再附上數(shù)字證書就可以了
5,接收者收到消息后,用CA的公鑰解開數(shù)字證書,拿到小明的真實(shí)公鑰,然后就能證明“數(shù)字簽名”是否真的是小明的。
下面看一個應(yīng)用“數(shù)字證書”的實(shí)例:https協(xié)議,這個協(xié)議主要用于網(wǎng)頁加密。
1.首先,客戶端向服務(wù)器發(fā)出加密請求。
2.服務(wù)器用自己的私鑰加密網(wǎng)頁以后,連同本身的數(shù)字證書,一起發(fā)送給客戶端。
3. 客戶端(瀏覽器)的”證書管理器”,有”受信任的根證書頒發(fā)機(jī)構(gòu)”列表。客戶端會根據(jù)這張列表,查看解開數(shù)字證書的公鑰是否在列表之內(nèi)。
4.如果數(shù)字證書記載的網(wǎng)址,與你正在瀏覽的網(wǎng)址不一致,就說明這張證書可能被冒用,瀏覽器會發(fā)出警告。
5. 如果這張數(shù)字證書不是由受信任的機(jī)構(gòu)頒發(fā)的,瀏覽器會發(fā)出另一種警告。
6. 如果數(shù)字證書是可靠的,客戶端就可以使用證書中的服務(wù)器公鑰,對信息進(jìn)行加密,然后與服務(wù)器交換加密信息。
多重簽名
n 個持有人中,收集到至少 m 個(n≥1)的簽名,即認(rèn)為合法,這種簽名被稱為多重簽名。
其中,n 是提供的公鑰個數(shù),m 是需要匹配公鑰的最少的簽名個數(shù)。
群簽名
1991 年由 Chaum 和 van Heyst 提出。群簽名屬于群體密碼學(xué)的一個課題。
群簽名有如下幾個特點(diǎn):只有群中成員能夠代表群體簽名(群特性);接收者可以用公鑰驗(yàn)證群簽名(驗(yàn)證簡單性);接收者不能知道由群體中哪個成員所簽(無條件匿名保護(hù));發(fā)生爭議時,群體中的成員或可信賴機(jī)構(gòu)可以識別簽名者(可追查性)。
Desmedt 和 Frankel 在 1991 年提出了基于門限的群簽名實(shí)現(xiàn)方案。在簽名時,一個具有 n 個成員的群體共用同一個公鑰,簽名時必須有 t 個成員參與才能產(chǎn)生一個合法的簽名,t 稱為門限或閾值。這樣一個簽名稱為(n, t)不可抵賴群簽名。
環(huán)簽名
環(huán)簽名由 Rivest,shamir 和 Tauman 三位密碼學(xué)家在 2001 年首次提出。環(huán)簽名屬于一種簡化的群簽名。
簽名者首先選定一個臨時的簽名者集合,集合中包括簽名者自身。然后簽名者利用自己的私鑰和簽名集合中其他人的公鑰就可以獨(dú)立的產(chǎn)生簽名,而無需他人的幫助。簽名者集合中的其他成員可能并不知道自己被包含在其中。
盲簽名
1983 年由 David Chaum 提出。簽名者在無法看到原始內(nèi)容的前提下對信息進(jìn)行簽名。
盲簽名主要是為了實(shí)現(xiàn)防止追蹤(unlinkability),簽名者無法將簽名內(nèi)容和結(jié)果進(jìn)行對應(yīng)。典型的實(shí)現(xiàn)包括 RSA 盲簽名)。
HMAC
全稱是 Hash-based Message Authentication Code,即“基于 Hash 的消息認(rèn)證碼”。基本過程為對某個消息,利用提前共享的對稱密鑰和 Hash 算法進(jìn)行加密處理,得到 HMAC 值。該 HMAC 值提供方可以證明自己擁有共享的對稱密鑰,并且消息自身可以利用 HMAC 確保未經(jīng)篡改。
HMAC(K, H, Message)
其中,K 為提前共享的對稱密鑰,H 為提前商定的 Hash 算法(一般為公認(rèn)的經(jīng)典算法),Message 為要處理的消息內(nèi)容。如果不知道 K 和 H,則無法根據(jù) Message 得到準(zhǔn)確的 HMAC 值。
HMAC 一般用于證明身份的場景,如 A、B 提前共享密鑰,A 發(fā)送隨機(jī)串給 B,B 對稱加密處理后把 HMAC 值發(fā)給 A,A 收到了自己再重新算一遍,只要相同說明對方確實(shí)是 B。
HMAC 主要問題是需要共享密鑰。當(dāng)密鑰可能被多方擁有的場景下,無法證明消息確實(shí)來自某人(Non-repudiation)。反之,如果采用非對稱加密方式,則可以證明。
-