1. 程式人生 > >數據的加密與簽名

數據的加密與簽名

而且 公鑰 數據加密 sha256 sign 方法 git 它的 由於

轉自: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. 使用 私鑰 加密,使用 公鑰 解密(私鑰簽名,公鑰驗簽)
  3. 更安全,當然速度會慢下來,如果隨著硬件的突破,使用越來越多,特別是支付

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_APRI_APUB_BPRI_B)。

  A向B發送Message的整個簽名和加密的過程如下:

  1. A先使用HASH對Message生成一個固定長度的信息摘要Message_hash_A
  2. A使用A的私鑰PRI_AMessage_hash_A進行簽名得到Message_sign(這裏為什麽不直接對Message進行簽名,而要對Message_hash_A進行簽名呢?因為Message的長度可能很長,而Message_hash_A的長度則是固定的,這樣性能更高,格式也固定,況且hash的結果一般不會出現重復的可能)
  3. A接著使用B的公鑰PUB_B對信息Message和信息Message_sign進行加密得到Message_RSA,這時A將Message_RSA發送給B。

  當B接收到A的信息Message_RSA後,獲取Message的步驟如下:

  1. B用自己的私鑰PRI_B解密得到明文:MessageMessage_sign
  2. 然後B使用A的公鑰PUB_AMessage_sign得到Message_hash_A;同時,B再對Message使用與A相同的HASH得到Message_hash_B
  3. 如果Message_hash_AMessage_hash_B相同,則說明Message沒有被篡改過。

上面的過程中,A知道A的公私鑰同時也要知道B的公鑰;同理B要知道A的公鑰和B的公私鑰

關於公私鑰再打個比方:公鑰就像一把鎖一樣將數據鎖住;私鑰就像鑰匙一樣,能將對應的鎖打開。

公鑰加密,私鑰解密的好處是:公鑰可以公開,那麽無論誰有公鑰都可以給你發送信息,而且也只有你才能解密

我們經常使用的Github就是使用了簽名的方法,SSH,在本地電腦生成一對公私鑰,將公鑰傳到github,然後使用私鑰進行簽名,github通過公鑰延簽後認為你的身份合法。

另外,加密和編碼是不一樣的,比如ASCII是屬於編碼,是將0~255與字符一一對應。

數據的加密與簽名