數據的加密與簽名
轉自:https://www.cnblogs.com/mddblog/p/5380556.html
一、 密碼概述
發送者對明文進行加密然後生成密文,接受者再對密文解密得到明文的過程。 現在使用的所有加密算法都是公開的!但是密鑰肯定不是公開的。
1 散列(哈希)函數
- 通常有MD5、SHA1、SHA256、SHA512
- 實質是抽取特征碼,這樣一般不會重復!是的,不同的文本它的哈希結果是有可能相同的,但概率很小。
(舉例:比如想要識別一個人,我們可以通過他的指紋來鎖定他,指紋出現相同的概率很低吧!在這裏,人就相當於數據,而指紋就相當於對人這個數據進行hash後得到的結果) - 對任意一個二進制數據進行哈希,可以得到定長的字符串結果,例如MD5哈希結果是128位,更多是以32個字符的十六進制格式哈希輸出
- 還有就是不可逆的,既然是不可逆的,那麽當然不是用來加密的,而是簽名
2 對稱加密算法
- 有DES、3DES、AES
- 加密和解密使用同一個秘鑰,加密解密的速度快
- 適合給大數據進行加密
- 密鑰的安全性非常重要
3 非對稱加密算法:RSA
- 使用
公鑰
加密,使用私鑰
解密 - 使用
私鑰
加密,使用公鑰
解密(私鑰簽名,公鑰驗簽) - 更安全,當然速度會慢下來,如果隨著硬件的突破,使用越來越多,特別是支付
1是對數據加密,2是防止偽造客戶端數據,對服務器攻擊,更重要是防止模擬了客戶端,進行支付相關的操作
註意: 公鑰是由私鑰經一系列不可逆的hash運算等到的.
4 對稱加密與非對稱加密的區別
就個人理解,最主要的就是密鑰的不同,對稱加密客戶端和服務端使用同一個密鑰,非對稱加密使用不同的密鑰。
客戶端的代碼是很容易被破解的,IDA、hopper disassembler
工具的使用,使得破解更加簡單而且破解後容易閱讀,再配合Charles抓取網絡包,根據關鍵字很容易就定位到加密代碼,然後獲取密鑰。
由於對稱加密密鑰一樣,所以解密就輕而易舉;但是非對稱加密就不會出現這種問題,因為服務端和客戶端的密鑰不一樣,公鑰加密私鑰解密,加密的公鑰也是公開的,而私鑰一般放在服務端,黑客一般是拿不到的。
另外就是沒有密鑰情況下強制暴力破解,非對稱加密也要比對稱加密花的多的多的時間來破解。一條信息就要花你幾年的時間,所以很安全。
二、加密與簽名區別(RSA)
- 最大的區別是,加密是可逆的,而簽名是不可逆的。
比如對於"Hello world!"
進行加密後得到結果R,還可以使用密鑰通過結果R解密得到"Hello world!"
;而對"Hello world!"
進行簽名得到結果R,卻不能使用密鑰通過R獲得"Hello world!"
,要不然的話壓縮算法要逆天了!比如hash,使用幾十個字符就能存儲幾G幾T的數據。。。
- 加密是對數據進行機密性保護,簽名主要用於身份驗證
比如A對B發送了信息Message;通過加密後,即便C通過網絡包截取獲得了Message,它也不知道裏面的具體內容,只能看到一堆亂碼;通過簽名,假設D也用相同的加密算法發送了此Message,但是簽名錯誤,那麽B通過簽名依然拒絕D的Message。
- 以當前使用的比較多的RSA為例舉例:
假設A、B雙方均擁有一對公私鑰(PUB_A
、PRI_A
、PUB_B
、PRI_B
)。
A向B發送Message的整個簽名和加密的過程如下:
- A先使用HASH對Message生成一個固定長度的信息摘要
Message_hash_A
- A使用A的私鑰
PRI_A
對Message_hash_A
進行簽名得到Message_sign
(這裏為什麽不直接對Message進行簽名,而要對Message_hash_A
進行簽名呢?因為Message的長度可能很長,而Message_hash_A
的長度則是固定的,這樣性能更高,格式也固定,況且hash的結果一般不會出現重復的可能) - A接著使用B的公鑰
PUB_B
對信息Message
和信息Message_sign
進行加密得到Message_RSA
,這時A將Message_RSA
發送給B。
當B接收到A的信息Message_RSA
後,獲取Message
的步驟如下:
- B用自己的私鑰
PRI_B
解密得到明文:Message
和Message_sign
; - 然後B使用A的公鑰
PUB_A
解Message_sign
得到Message_hash_A
;同時,B再對Message
使用與A相同的HASH得到Message_hash_B
; - 如果
Message_hash_A
與Message_hash_B
相同,則說明Message
沒有被篡改過。
上面的過程中,A知道A的公私鑰同時也要知道B的公鑰;同理B要知道A的公鑰和B的公私鑰
關於公私鑰再打個比方:公鑰
就像一把鎖一樣將數據鎖住;私鑰
就像鑰匙一樣,能將對應的鎖打開。
公鑰加密,私鑰解密的好處是:公鑰可以公開,那麽無論誰有公鑰都可以給你發送信息,而且也只有你才能解密
我們經常使用的Github就是使用了簽名的方法,SSH,在本地電腦生成一對公私鑰,將公鑰傳到github,然後使用私鑰進行簽名,github通過公鑰延簽後認為你的身份合法。
另外,加密和編碼是不一樣的,比如ASCII是屬於編碼,是將0~255與字符一一對應。
數據的加密與簽名