講講在銀聯電子支付工作時加解密、簽名驗籤的那些事(純粹的乾貨)。
今天我們來講講系統間的互動需要哪些必要的東西才能確保互相通訊會沒有問題呢?
首先來看看最傳統的系統互動,即兩者直接互相明文傳送,在這種情況下,若是被第三方攔截,會造成不可預估的影響。那麼針對這種情況我們應該如何避免呢?那好,我們來看看銀聯電子支付公司是如何解決這個問題的。他們的解決方案適用於大部分情況下。(下面所描述的A代表商戶,B代表CP即ChinaPay)
在互動的過程中,我們必須明確兩點:1、假設A和B兩者通訊的時候,B必須確保是A傳送的;2、A傳送的報文中途傳輸的過程中,他人沒有修改;如何確保這兩點,在回答這兩個問題之前,先給大家說下必須有兩對公私鑰,即A的公私鑰、B的公私鑰,公私鑰的區別,私鑰是他人無法獲取的,相當於咱們的個人身份證用於標識某個人的;而公鑰是可以提供給他人的,這是最直接明瞭的區別,我們加解密的時候必須是使用哪個公鑰加的,就必須要哪個私鑰去解密 。好了繼續迴歸正題,首先如何確保上述描述1,即我剛剛說的私鑰相當於個人身份證,用它來實現1就再好不過了。那如何確保2呢,hash演算法可以瞭解下,如果還不瞭解hash演算法的話可以去百度百度,正是因為hash演算法的不可逆,用它來實現2也最好不過了。好了既然1、2都能想到用什麼方法去解決,那好進入咱們今天的主題,加解密、簽名、驗籤。
加密、簽名:為什麼把這兩個放在一起講呢,因為它倆是A(商戶)傳送B(CP)的步驟,先說說加密,當報文中有敏感資訊的時候,傳送給B的時候需要進行加密處理,例如有卡交易域資訊等等這個時候需要對它加密,加密演算法利用RSA演算法,是利用B的公鑰進行加密的,加密成功後,放到該欄位裡,然後將整個報文進行簽名處理,上面有說簽名是拿自己的私鑰去簽名的即此處拿A的私鑰進行簽名的,簽名成功後放到Signature欄位中,然後將整個報文和Signature一起傳送給B(這個時候報文中的value值都是需要URLEncode,防止B接收解析的時候會有出現中文亂碼)。
解密、驗籤:它倆是當B處理完後傳送A時,A需要進行的操作,A去解密B傳送的加密欄位是利用A的私鑰
PS:給一個好記的說辭來總結今天說的內容吧,簽名是拿私鑰簽名;加密是拿公鑰加密;只不過私鑰公鑰用的是哪個角色的,還需要大家明記的!
現在大家懂了這4者的原委了吧。希望大家在面試的時候能夠信手拈來!共勉!