數(shù)字簽名介紹
碰到的問題
- 數(shù)字通信時我們碰到了幾個問題:防篡改、確認(rèn)發(fā)送者、防否認(rèn)
- 消息認(rèn)證碼只能解決防篡改和確認(rèn)發(fā)送者,卻無法解決**防否認(rèn)。
- 主要原因是消息認(rèn)證碼采取的發(fā)送者和接收者共享密鑰的方式,這樣如果為了防止否認(rèn)需要引入第三方認(rèn)證時,第三方是無法知曉到底計(jì)算的MAC是屬于誰的。
數(shù)字簽名解決問題原理
- 簡單的說使用了類似公鑰密碼的技術(shù)來解決防止否認(rèn)的問題。
-
公鑰密碼是發(fā)送方使用接收方的公鑰加密,而接收方使用自己的私鑰解密。
數(shù)字簽名正好相反,發(fā)送方使用自己的私鑰加密,而其他任何人都使用公鑰進(jìn)行解密。 - 由于是使用公鑰進(jìn)行解密,也就是說任何人都可以進(jìn)行解密,畢竟簽名的作用是用來驗(yàn)證的。既然是任何人,意味著第三方也可以做驗(yàn)證了。
由于是用自己的私鑰進(jìn)行加密,所以無論如何是沒法否認(rèn)消息不是自己發(fā)的了,因?yàn)樗借€只有自己知道。
數(shù)字簽名的使用方法
數(shù)字簽名的流程
雖然可以直接對消息進(jìn)行加密,但是一般應(yīng)該是對消息的散列值進(jìn)行加密。
- 發(fā)送者生成私鑰和公鑰,將公鑰發(fā)送給接收者
- 發(fā)送者將消息生成散列值,針對散列值用私鑰進(jìn)行加密,并將加密后的結(jié)果發(fā)送給接收者
- 接收者接收到消息后,生成散列值
- 接收到加密后的散列值后,使用公鑰進(jìn)行解密得到散列值
- 接收者將自己生成的散列值 和 解密后的散列值進(jìn)行比對,如果相同則驗(yàn)證成功。
由于使用了散列值,所以可以防篡改。
由于使用了私鑰加密,所以可以確認(rèn)發(fā)送者,同時防止否認(rèn)。
對數(shù)字簽名的疑問
數(shù)字簽名的疑問書中有很多點(diǎn),這里只摘取覺得必要的問題。
- **刪除簽名也無法"作廢合同"嗎
-
疑問
如果是紙質(zhì)的借據(jù),撕毀原件就可以作廢。但是數(shù)字簽名是計(jì)算機(jī)文件,即使刪除也可能有其他的拷貝,那么無法作廢的簽名是不是非常不方便? -
解答
確實(shí)帶有數(shù)字簽名的借據(jù)不能像紙件刪除原件就可以作廢,因?yàn)閿?shù)字簽名文件壓根就不存在原件的概念。解決的辦法是:
重新創(chuàng)建一份相當(dāng)于收據(jù)的文件加上數(shù)字簽名即可。
或者在消息中聲明該消息的有效期并加上數(shù)字簽名,公鑰的證書就屬于這種情況。
-
疑問
-
數(shù)字簽名真的能夠代替簽名嗎
-
疑問
紙質(zhì)借據(jù)上如果不簽名蓋章的話,總是覺得不太放心。數(shù)字簽名真的能夠有效代替現(xiàn)實(shí)世界中的簽名和蓋章嗎? -
解答
數(shù)字簽名沒有辦法完全替代手動簽名,很大的原因在于簽訂合同、進(jìn)行認(rèn)證這樣的行為是一種社會性的行為。
美國于2000年頒布了E-SIGN法案,日本于2001年頒布了電子簽名及其認(rèn)證業(yè)務(wù)的相關(guān)法律。這些法律為電子手段實(shí)現(xiàn)的簽名和手寫的簽名和蓋章同等處理提供了法律基礎(chǔ)。
但是實(shí)際過程中仍舊會有很多圍繞數(shù)字簽名的訴訟。畢竟電腦可能中毒,也有可能不是這個軟件簽名等等因素在里面。
-
疑問
數(shù)字簽名的實(shí)際應(yīng)用
-
安全信息公告
信息安全公告是發(fā)布官方漏洞的,但是這個消息是需要看的人判斷真?zhèn)?、判斷是否被篡改的。所以在消息后加上?shù)字簽名即可,消息本身無需加密,因?yàn)楸緛砭褪墙o別人看的。 -
軟件下載
為了防止軟件被篡改,導(dǎo)致使用者用了盜版軟件,所以軟件發(fā)布者需要加上數(shù)字簽名,以幫助軟件使用者做校驗(yàn)。 -
公鑰證書
為了保證自己使用的公鑰是合法的公鑰,所以需要對公鑰進(jìn)行數(shù)字簽名加以驗(yàn)證。這個就是公鑰證書。 -
SSL/TLS
SSL/TLS在認(rèn)證服務(wù)器身份是否合法時會使用服務(wù)器證書,它就是加上了數(shù)字簽名的服務(wù)器公鑰。對客戶端認(rèn)證也會使用客戶端證書。
通過RSA實(shí)現(xiàn)數(shù)字簽名
RSA在公鑰加密時已經(jīng)詳細(xì)介紹了,所以細(xì)節(jié)不再介紹。
一開始我的疑問是為什么又是RSA呢?數(shù)字簽名和公鑰加密不是反過來的嗎?難道不需要新的算法?
其實(shí)RSA只是用來生成公私鑰對的,至于哪個用于加密和哪個用于解密,就看是用于公鑰加密還是用于數(shù)字簽名了。
對數(shù)字簽名的攻擊
-
中間人攻擊
中間人攻擊的實(shí)質(zhì)是截獲了接收方發(fā)出的公鑰或者私鑰,并將自己的公鑰或者私鑰發(fā)送給另外一方。所以針對公鑰密碼的中間人攻擊,針對數(shù)字簽名同樣有效。
具體解決的辦法就是涉及公鑰密碼的軟件都顯示公鑰的散列值,也就是指紋。比對指紋的正確性就能確認(rèn)公鑰是不是對方的公鑰了。 - 對單向散列函數(shù)的攻擊
-
利用數(shù)字簽名攻擊公鑰密碼
- 這是一個巧妙的攻擊方式。
- A與B進(jìn)行通信,A是用B的公鑰進(jìn)行加密的,B用私鑰進(jìn)行解密。
- 數(shù)字簽名過程中,公鑰卻是用來解密的,私鑰是用來加密的。
- 而且 公鑰密碼中的私鑰解密 和 數(shù)字簽名中的私鑰加密是相同的公式。
- 所以,攻擊者可以保存A用公鑰加密后的消息。然后發(fā)郵件給B說需要做一個數(shù)字簽名實(shí)驗(yàn),需要B對消息進(jìn)行加密。
- B一旦使用自己的私鑰對所謂的簽名消息進(jìn)行加密,實(shí)際上就是對A發(fā)送的消息進(jìn)行解密。這就完成了攻擊。
- 防御的辦法
- 不要用消息直接加密,使用散列值加密
- 公鑰密碼和數(shù)字簽名最好不要使用相同的密鑰對
- 絕對不要對意思不清楚的消息進(jìn)行簽名
- 這是一個巧妙的攻擊方式。
各種密碼技術(shù)對比
消息認(rèn)證碼和數(shù)字簽名
關(guān)鍵區(qū)別:
- 密鑰配送問題:消息認(rèn)證碼存在此問題;數(shù)字簽名不存在此問題,但是公鑰必須有另外的認(rèn)證(詳細(xì)見中間人攻擊)
- 認(rèn)證:消息認(rèn)證碼支持,但是只能在通信雙方之間;數(shù)字簽名支持,并且可以支持第三方認(rèn)證。
- 防止否認(rèn):消息認(rèn)證碼不支持;數(shù)字簽名支持。
數(shù)字簽名無法解決的問題
數(shù)字簽名可以 防篡改、檢驗(yàn)發(fā)送者真?zhèn)?、防否認(rèn),這些都是針對消息本身的。
但是在解決消息本身的這些問題時,帶入了一個數(shù)字簽名機(jī)制本身的問題,就是公鑰持有者的真?zhèn)螁栴}(中間人攻擊)。
判斷公鑰是否合法,這就需要使用到證書,而且需要引入第三方來認(rèn)證。