博主:愛(ài)碼叔
費(fèi)縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
個(gè)人博客站點(diǎn): icodebook
公眾號(hào):漫話軟件設(shè)計(jì)
專注于軟件設(shè)計(jì)與架構(gòu)、技術(shù)管理。擅長(zhǎng)用通俗易懂的語(yǔ)言講解技術(shù)。對(duì)技術(shù)管理工作有自己的一定見(jiàn)解。文章會(huì)第一時(shí)間首發(fā)在個(gè)站上,歡迎大家關(guān)注訪問(wèn)!
更多密碼學(xué)文章
信息加密保證了機(jī)密性。這是否意味著只要合理使用加密技術(shù)就足夠安全了呢?
答案肯定是否定的。加密技術(shù)僅僅解決了信息傳遞過(guò)程中的機(jī)密性。但如果信息被攻擊者截獲,篡改了里面的內(nèi)容,再用公鑰加密發(fā)出來(lái),接收人是無(wú)法識(shí)別的。這里就需要使用電子簽名來(lái)保證信息的完整性。
散列值先不急著說(shuō)電子簽名,我們先看看基礎(chǔ)知識(shí) - 散列值。
散列值可以認(rèn)為是信息的“指紋”。眾所周知,指紋可以證明人的身份。每個(gè)人的指紋都不一樣,通過(guò)對(duì)比指紋,可以確定留下指紋的人是誰(shuí)。
這里用指紋做類比容易造成誤解。請(qǐng)注意散列值是信息的指紋,也就是說(shuō) “指紋” 只能證明 “信息” 的身份,就像指紋用來(lái)證明人的身份一樣。請(qǐng)不要理解為散列值是發(fā)信人的指紋。
什么是散列值我們?cè)谌杰浖W(wǎng)站下載的某些軟件,解壓后會(huì)有一個(gè) md5 字符串。這個(gè)東西就是你下載的軟件文件的散列值。我們可以用下載文件重新生成 md5 值與之做對(duì)比。如果兩者一致,說(shuō)明軟件文件沒(méi)有被篡改。否則你下載的軟件已經(jīng)被篡改,不要再安裝。
md5 其實(shí)就是一種散列算法。md5的全稱是 Message-Digest Algorithm 5。散列算法的作用就是將一大段信息計(jì)算出固定長(zhǎng)度的字符串。這個(gè)固定長(zhǎng)度的字符串就叫做散列值。從 md5 的全稱也可以看出,它是信息的摘要,并不是完整信息。
散列函數(shù)計(jì)算散列值的函數(shù)就叫做散列函數(shù)。散列函數(shù)也稱為單向散列函數(shù)。函數(shù)的輸入是任意長(zhǎng)度的信息,輸出為固定長(zhǎng)度且很短的散列值。
散列函數(shù)特性散列函數(shù)應(yīng)該具備如下特性:
同樣信息,無(wú)論計(jì)算幾次,算出的散列值要一致。只有這樣,散列值才能用來(lái)做信息完整性的驗(yàn)證。不同信息散列值不同,確保不會(huì)被錯(cuò)誤驗(yàn)證。第三點(diǎn)是對(duì)計(jì)算性能的要求。
有哪些散列函數(shù)MD5
MD5是Rivest于1991年設(shè)計(jì)的散列函數(shù)。產(chǎn)生的散列值長(zhǎng)度為128bit。但是MD5已經(jīng)被攻破,現(xiàn)在可以生成兩個(gè)相同MD5的不同消息。所以不建議繼續(xù)使用MD5.
SHA-1
SHA-1 是由NIST(Natinal institute of Standards and Technology)于1993 年設(shè)計(jì)的散列函數(shù)。其產(chǎn)生的散列值長(zhǎng)度為160 bit。由于SHA-1也已經(jīng)被攻破,所以不推薦使用。
SHA-256、SHA-384、SHA512
這些散列函數(shù)都是由NIST設(shè)計(jì)。分別對(duì)應(yīng)散列值長(zhǎng)度256、384、512 bit。統(tǒng)稱為SHA-2。SHA-2目前還未被攻破,可以放心使用。
散列函數(shù)的作用散列函數(shù)用來(lái)生成散列值。散列值是消息的指紋,意味著當(dāng)消息被改動(dòng)后,生成的散列值也會(huì)發(fā)生改變。并且不同消息很難生成同樣的散列值。根據(jù)這些特性,散列函數(shù)有如下應(yīng)用:
密碼加密存儲(chǔ)在數(shù)據(jù)庫(kù)中的用戶密碼,肯定不能是明文的,否則任何接觸到數(shù)據(jù)庫(kù)的人員會(huì)看到系統(tǒng)中所有用戶的密碼,毫無(wú)安全可言。一種可行的方案是,將密碼加鹽后,生成散列值,然后存儲(chǔ)到DB中。用戶登錄時(shí),程序使用輸入的密碼加鹽,重新計(jì)算散列值,和DB中保存的散列值對(duì)比。如果一致,認(rèn)為登錄成功。這樣避免了存儲(chǔ)明文密碼。
數(shù)字簽名散列值確保消息沒(méi)有被篡改,而數(shù)字簽名還能保證信息的來(lái)源可靠。數(shù)字簽名是 01 世界中的簽字畫押。對(duì)完整信息生成數(shù)字簽名非常耗時(shí)。既然散列值能 “代表” 完整信息,那么可以先將完整信息生成散列值,然后對(duì)信息的散列值生成數(shù)字簽名。這就像蓋章一般也不會(huì)每頁(yè)都蓋,通常蓋在最后一頁(yè)就可以了。
消息認(rèn)證碼消息認(rèn)證碼用于通信過(guò)程中檢查傳輸錯(cuò)誤和篡改。通過(guò)通信雙方共享的密鑰和信息內(nèi)容生成散列值,這樣發(fā)送方和接收方就可以進(jìn)行檢查。
消息認(rèn)證碼 消息認(rèn)證碼解決的問(wèn)題消息認(rèn)證碼使用消息和通訊雙方共享的密鑰生成的散列值。散列值無(wú)法用于通信方偽裝的識(shí)別,但是加上共享密鑰后,可以做到這一點(diǎn)。只有使用協(xié)商好的密鑰生成認(rèn)證碼,通信對(duì)方才能生成同樣的認(rèn)證碼。如果偽裝者不知道密鑰,就無(wú)法生成正確的認(rèn)證碼。
消息認(rèn)證碼的問(wèn)題與局限可以看出消息認(rèn)證碼的機(jī)制和對(duì)稱加密很像,需要通信雙方共享密鑰。如果看過(guò)我之前關(guān)于對(duì)稱加密的文章《加密就像玩魔方----詳解對(duì)稱加密》,應(yīng)該了解此處存在密鑰配送問(wèn)題。要解決密鑰配送問(wèn)題之前的文章中也有描述(《圖文徹底搞懂非對(duì)稱加密(公鑰密鑰)》),這里就不再詳述。
通信雙方可以使用消息認(rèn)證碼來(lái)驗(yàn)證消息來(lái)自對(duì)方。但是由于二者持有的密碼是一樣的,因此無(wú)法向第三方證明某條消息是誰(shuí)發(fā)出的。誰(shuí)都有可能用互相知道的密鑰生成一段消息的認(rèn)證碼。正是如此,任何一方都可以否認(rèn)消息是我發(fā)出的。
以上是消息認(rèn)證碼的局限,數(shù)字簽名可以解決這些問(wèn)題。
數(shù)字簽名 什么是數(shù)字簽名散列值可以看作信息的身份證明,接收方重新為信息生成散列值,和發(fā)送方提供的散列值對(duì)比,可以證明信息沒(méi)有被篡改。但是無(wú)法證明信息的發(fā)送方是誰(shuí)。
數(shù)字簽名好比發(fā)送方給信息簽名蓋章、按手印。收信方通過(guò)對(duì)比手印,判斷是否來(lái)自合法發(fā)送方。
如何進(jìn)行數(shù)字簽名發(fā)送方的數(shù)字簽名,不同接收方都可以驗(yàn)證。是不是有些似曾相識(shí)?公鑰密鑰的特點(diǎn)是任何發(fā)送方都可以對(duì)信息加密,只有接收方可以解密。是不是反過(guò)來(lái)了?沒(méi)錯(cuò),其實(shí)數(shù)字簽名就是公鑰密鑰的逆向應(yīng)用。
數(shù)字簽名也需要用到公鑰和私鑰。信息發(fā)送方使用自己的私鑰進(jìn)行簽名。這非常好理解,因?yàn)樗借€是發(fā)送方的身份象征,所以需要用私鑰簽名。接收方則使用發(fā)送方的公鑰進(jìn)行驗(yàn)證。這樣任何與發(fā)送方通訊的人都可以驗(yàn)證發(fā)送方簽名。只要發(fā)送方保護(hù)好自己的私鑰,攻擊者無(wú)法仿造發(fā)送方簽名。
對(duì)稱加密需要對(duì)整條信息加密,原因在于解密需要還原出完整明文。但是簽名不一樣,簽名只需要驗(yàn)證信息的合法性,并不需要還原簽名用到的信息數(shù)據(jù)。而且由于對(duì)整條信息的簽名運(yùn)算非常耗時(shí),實(shí)際應(yīng)用中并不會(huì)用完整信息生成簽名,而是使用完整信息的散列值來(lái)生成簽名。因?yàn)樯⒘兄凳切畔⒌闹讣y,代表了信息的身份。所以只要通信雙方協(xié)商好散列值算法,同樣的信息必然運(yùn)算出相同的散列值。簽名和驗(yàn)簽也就能正常工作。
需要注意,雖然數(shù)字簽名使用密鑰加密技術(shù)。但其實(shí)并不是為了確保信息的機(jī)密性。私鑰是為了確保只有發(fā)信人才能簽名,其他任何人無(wú)法簽名。這樣接收方通過(guò)對(duì)簽名的驗(yàn)證,就可以確保消息來(lái)源安全。
前面用按手印作類比,幫助理解數(shù)字簽名。沒(méi)錯(cuò),數(shù)字簽名的作用和手印是相似的。
更貼切來(lái)說(shuō),每個(gè)人指紋不同,其實(shí)是每個(gè)人生成簽名的私鑰不同,并不是數(shù)字簽名不同。
手印有一個(gè)非常大的局限性就是,不管信息內(nèi)容如何手印都是一樣的。這就出現(xiàn)了一個(gè)非常大的漏洞,我可以先讓別人在白紙上按手印,然后內(nèi)容我隨便寫。此外簽名后的文件如需修改非常不方便。拿合同舉例,任何內(nèi)容的變化,都需要在變化處再加按手印。
此時(shí),數(shù)字簽名的優(yōu)勢(shì)就凸顯出來(lái)。只要信息不同,數(shù)字簽名就是不同的。拿白紙騙手印,再往上編內(nèi)容的情況是絕不可能出現(xiàn)的。
我們可以將數(shù)字簽名看作是將信息和指紋通過(guò)特定算法計(jì)算出來(lái)的信息。
數(shù)字簽名識(shí)別偽裝的同時(shí),還能夠識(shí)別篡改。從這個(gè)角度看,數(shù)字簽名比簽字畫押更具優(yōu)勢(shì)。
數(shù)字簽名的運(yùn)用及其局限性 不能保證信息機(jī)密性數(shù)字簽名驗(yàn)證的是信息篡改和偽裝。但數(shù)字簽名無(wú)法保證信息的機(jī)密性。 如果對(duì)安全有很高的要求,可以同時(shí)使用數(shù)字簽名和加密。在金融領(lǐng)域,這也是常見(jiàn)的安全方案。
沒(méi)有單獨(dú)存在的價(jià)值數(shù)字簽名不需要被保密,也可以被任意復(fù)制。數(shù)字簽名沒(méi)有單獨(dú)存在的意義,他必須和信息同時(shí)出現(xiàn)才有價(jià)值。就像在白紙上的簽字沒(méi)有任何意義,只有在文件簽字才有意義。
如何防止否認(rèn)由于采用了非對(duì)稱加密的方式簽名,所以只有信息發(fā)送方才能生成簽名。這和使用對(duì)稱加密生成的消息認(rèn)證碼是不同的。因?yàn)橹挥幸环侥苌珊灻?,所以簽名方無(wú)法否認(rèn)信息的簽名不是自己生成的。
無(wú)法解決的問(wèn)題如本文所述,數(shù)字簽名解決了對(duì)發(fā)送方的信任問(wèn)題。等等,真的解決了嗎?我怎么知道手中的發(fā)送方公鑰就是合法通信方的公鑰呢?有沒(méi)有可能攻擊者一開(kāi)始就偽裝成合法通信方,把他的公鑰給了我?如果是這樣的話,整套數(shù)字簽名的驗(yàn)證體系就被徹底攻破了!
為了解決這個(gè)問(wèn)題,證書被引入進(jìn)來(lái)。證書其實(shí)就是可信第三方對(duì)公鑰的簽名。但是在驗(yàn)證可信第三方的簽名時(shí),又需要使用可信第三方的公鑰??尚诺谌骄驼娴目尚艈??誰(shuí)來(lái)證明可信第三方的公鑰合法性?這樣就陷入了信任鏈條之中。
其實(shí)這就是證書的層級(jí)結(jié)構(gòu)。本文不展開(kāi)講,詳細(xì)可以參考我的另外一篇文章《證書-解決非對(duì)稱加密的公鑰信任問(wèn)題》。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧