谈谈数字签名
數字簽名是什么
相信大家不會陌生,日常我們和公司簽合同時會簽名,刷信用卡支付時會簽名;而數字簽名就是將日常中這種簽名功能在計算機中實現的一種技術;數字簽名不僅能夠識別篡改和偽裝,還能防止否認等特性,那么數字簽名是如何做到的呢?
##簽名生成與校驗
生成簽名:一般是發送者對發送的消息進行簽名,以表示我認可該消息
驗證簽名:接受者對發送者發送的簽名進行驗證,已確定該簽名是否是發送者簽署的,如果驗簽失敗表示該簽名不是發送者的或者發送的消息被人篡改了
無論是生成簽名還是驗證簽名都需要密鑰來完成;生成簽名需要簽名密鑰來,驗證簽名動作需要驗簽密鑰來完成,簽名密鑰只有簽名者才能有,驗證密鑰則是任何驗證簽名的人都可以擁有;只有簽名密鑰才能生成簽名,只有驗證密鑰才能驗簽;
上面說的是不是有點和公鑰密鑰算法類似?對,確實有很大關系,其實數字簽名是將公鑰密碼算法反過來使用,我們先來簡要回顧下公鑰密碼算法
- 公鑰加密后的密文只能用與公鑰相匹配的私鑰進行解密
- 公鑰顧名思義可以被公開
- 私鑰只能被需要解密方所擁有,只要私鑰不泄漏,竊取者即使攔截到密文和公鑰也無法破解到明文
- 公鑰密碼解決了對稱密碼密鑰配送的問題
##數字簽名
###對消息進行簽名
假如lin向四縱發"死守塔山"這條命令,其流程如下:
其實在實際生活中,我們考慮到消息有時很大,通常不直接對消息原文進行加簽,而是先對消息原文進行單向序列化以生成一個消息摘要(可以理解為消息的指紋),我們對該消息摘要進行加簽,這樣就大大提高加簽速度了,其他的和上面圖一樣,具體見下圖就不解釋了
###對消息摘要進行加簽
##對簽名的一些疑問
問題1:簽名在計算機中只是一段字符串,那么簽名不就可以復制了?如果我把簽名放到別的消息中,是不是可以偽裝呢?
確實在計算機中簽名就是一段很短的字符串,可以復制,但是簽名本身代表的我認可這條消息含義是無法改變的
如果把簽名放到別的消息中,接受方在驗簽時會失敗
問題2 上述圖中消息在網絡傳輸時是明文傳輸的,簽名不就不能保證數據的安全性?
簽名并不是為了保證數據安全性,它只是表示我對該消息認可的憑證
問題3上述圖中公鑰是通過網絡傳輸的,那么接收方不就有可能收到的公鑰其實不是發送方?
對,在網絡過程中數據都有可能被中間人攔截,并篡改;如何保證公鑰的合法性就需要用到數字證書了
總結
- 上一篇: Android Lifecycle源码解
- 下一篇: Android构建流程——篇一