|
一、什么是非對稱加密算法
加密和解密所用的密鑰是不一樣的,所以叫“非對稱”。 非對稱加密算法的這兩個密鑰,一個稱為公鑰,一個稱為私鑰。 所謂公鑰和私鑰不是絕對的,公鑰和私鑰只是經過算法運算得到的一對數(shù)值,公開的那一個值稱為公鑰,不公開的稱為私鑰。 用公鑰加密的,可以用私鑰解密,反過來也成立。 RSA就是典型的非對稱加密算法。 關于RSA算法的解釋,最經典的當然是阮一峰老師的博客了: http://www./blog/2013/06/rsa_algorithm_part_one.html http://www./blog/2013/07/rsa_algorithm_part_two.html 想當初我看懂之后還在紙上自己推導了一遍,可惜后來又忘記了,只記得一個歐拉定理。。 二、使用非對稱加密算法通信的原理 由于非對稱加密算法一般比較慢,因此他一般用于密鑰交換。這個交換的密鑰就是指對稱密鑰。 通常,發(fā)送方用公鑰加密,接收方用私鑰解密。假如你是接收方,你可以把公鑰公開出去,那其他人想要與你通信時,先用你的公鑰把對稱密鑰加密后傳遞給你,你再通過私鑰解密得到對稱密鑰。從這以后,雙方都有對稱密鑰了,雙方的通信信息就通過這個密鑰來加密解密。 知乎上的一個回答說明了同樣的過程(https://www.zhihu.com/question/20744215/answer/16056710): Java代碼
三、實際例子 3.1 https的通信建立就是用RSA:
第三步的crt public就是服務端的公鑰(傳說中的證書,當然證書還會包含其他信息),發(fā)給了客戶端。 第五步的random key就是對稱密鑰。第五步完成后,對稱密鑰就交換成功了。 3.2 http接口遠程調用參數(shù)的加密 以實際項目中,調用A公司的http接口為例: 假設params是可以在公網上安全傳輸?shù)闹?,顯然不能是明文,那它是怎么來的呢: 偽代碼: Java代碼
其中的merchantId=111&sences=222&productId=333&extParams=444就是要傳遞的參數(shù)。 加密方法encrypt分三步:用A公司公鑰(A公司的私鑰在它們那里,不公開)加密再用base64編碼再經過url-encode。 可以推知,A公司的解密過程就是先url-decode再base64解密,最后用它的私鑰解密得到消息的明文。 那如何保證消息明文沒有被篡改呢? 此時就需要我們調用傳參時,同時傳遞數(shù)字簽名: 假設上一步算得params="555",則最后在http報文體中傳遞的就是params=555&sign=888,而這個sign就是數(shù)字簽名: 先hash再用我們的私鑰(我們的公鑰會直接給到A公司的開發(fā)人員,A公司的公鑰也是直接給到我們)加密: Java代碼
可以看到,數(shù)字簽名不是一成不變的,它隨著消息的改變而改變。它與我們現(xiàn)實中的個人簽名不同,個人簽名每次都是簽同一個名字。 A公司接收到簽名后,用我們的公鑰解密得到消息摘要(假設為digestX),然后把之前解密得到的消息明文hash一下,得到digestY,比較這兩個值是否相等,則可以知道消息有沒有被篡改。 說到這里我們發(fā)現(xiàn),我們需要提前與A公司協(xié)定好hash算法(例如sha1)。 那黑客有沒有可能同時篡改消息和簽名呢?不可以,因為他沒有我們的私鑰,改不了簽名。 在這http調用過程中,總結一句話: 用對方的公鑰來加密消息,用我們自己的私鑰來簽名。 |
|
|