數字簽名在數據的交互中一直都占據著很重要的地位,因此,這篇文章對其原理進行整理總結一下。最后再給出代碼的實現。
一、簡單認識
相信我們都寫過信,在寫信的時候落款處總是要留下自己的名字,用來表示寫信的人是誰。我們簽的這個字就是生活中的簽名:
而數字簽名呢?其實也是同樣的道理,他的含義是:在網絡中傳輸數據時候,給數據添加一個數字簽名,表示是誰發的數據,而且還能證明數據沒有被篡改。
OK,數字簽名的主要作用就是保證了數據的有效性(驗證是誰發的)和完整性(證明信息沒有被篡改)。下面我們就來好好的看一下他的底層實現原理是什么樣子的。
二、基本原理
為了理解的清楚,我們通過案例一步一步來講解。話說張三有倆好哥們A、B。由于工作原因,張三和AB寫郵件的時候為了安全都需要加密。于是張三想到了數字簽名:
整個思路是這個樣子的:
第一步:加密采用非對稱加密,張三有三把鑰匙,兩把公鑰,送給朋友。一把私鑰留給自己。第二步:A或者B寫郵件給張三:A先用公鑰對郵件加密,然后張三收到郵件之后使用私鑰解密。第三步:張三寫郵件給A或者B:(1)張三寫完郵件,先用hash函數生成郵件的摘要,附著在文章上面,這就完成了數字簽名,然后張三再使用私鑰加密。就可以把郵件發出去了。(2)A或者是B收到郵件之后,先把數字簽名取下來,然后使用自己的公鑰解密即可。這時候取下來的數字簽名中的摘要若和張三的一致,那就認為是張三發來的,珊再對信件本身使用Hash函數,將得到的結果,與上一步得到的摘要進行對比。如果兩者一致,就證明這封信未被修改過。
上面的流程我們使用一張圖來演示一下:
首先把公鑰送給朋友A和B:
打開UC瀏覽器 查看更多精彩圖片
然后呢,就是朋友A或者B給張三發郵件:
還有就是最后一個比較麻煩的,張三給A或者B發郵件:
OK,上面的這幾張圖想必你應該能夠理解清楚了,其實還有一些很復雜的情況,因為上面的數字簽名是在理想狀態下完成的,但是如果遇到了公鑰錯誤,摘要不正確該如何處理呢?這里就涉及到數字證書了,我們來分析一下。
三、數字證書
上面提到我們對簽名進行驗證時,需要用到公鑰。如果公鑰是偽造的,那我們無法驗證數字簽名了,也就根本不可能從數字簽名確定對方的合法性了。這時候證書就閃亮登場了。我們可能都有考各種證書的經歷,比如說普通話證書,四六級證書等等,但是歸根結底,到任何場合我們都能拿出我們的證書來證明自己確實已經考過了普通話,考過了四六級。這里的證書也是同樣的道理。
如果不理解證書的作用,我們可以舉一個例子,比如說我們的畢業證書,任何公司都會承認。為什么會承認?因為那是國家發的,大家都信任國家。也就是說只要是國家的認證機構,我們都信任它是合法的。
那么這個證書是如何生成的呢?我們再來看一張圖:
此時即使張三的朋友A把公鑰弄錯了,張三也可以通過這個證書驗證。
四、代碼驗證
常用的數字簽名算法有:RSA、DSA、ECDSA。這里的代碼參考了慕課網。下面給出三種方式的代碼實現:
1、RSA
2、DSA
3、ECDSA
代碼已經在這里了,可以自己去實現一遍即可。