(一)關於網路傳輸中的加密和加簽的問題
開發中經常會存在不同系統之間的資料共享,那麼通過介面方式傳輸資料就是一件很方便的方式了。現在還有很多公司是用的http傳輸的資料,那麼資料是不安全的存在著資料在傳輸過程中發生洩漏的風險,所以現在資料傳輸常用的就是加密和加簽的方式來保證資料的安全。
加密和加簽中用到了非對稱性加密(RSA),而非對稱性加密需要兩個祕鑰來進行加密和解密,這兩個祕鑰是公鑰(publickey)和私鑰(privatekey)。公鑰一般都是給別人的,自己留著私鑰,這樣即使別人知道了公鑰沒有私鑰,所以加強了資料的安全性。
首先我們要明白什麼是祕鑰,祕鑰是由RSA(公鑰+模值)、(私鑰+模值)分組分發的,單獨發公鑰或者私鑰匙沒有用的,所以我們俗話說的“金鑰”其實是他們兩者中的其中一組。但我們說的“金鑰長度”一般只是指模值的位長度。目前主流可選值:1024,、2048、3047。模值有專門的工具素數生成器,給他幾個數,告訴他多少位的素數他就會幫你自動生成。素數生成器有時候也會是1023也會是1024 自己要看好。
明文長度和密文長度,1024對應的明文長度是128字元,但因為考慮到自適應所以要用到RSA的padding模式,padding模式要佔11字元,所以實際上的明文長度就是128-11=117字元。密文長度就是明文加密後的長度。
資料加簽:
首先我們需要我們導個包,SADK
這個jar包裡有
SecKeyEncrypt:使用公鑰對資料進行加密
SecKeyDecrypt:使用私鑰對資料進行解密
SeckeyRawVerify:使用公鑰 對數字簽名和資料進行驗證,以確認該資料的來源合法性。
SecKeyRawSign:使用私鑰對資料進行摘要並生成數字簽名
RSA演算法有2個作用一個是加密一個是加簽。從這幾個函式中,我們可以看到,我們第一種是使用公鑰能在客戶端:資料加密,以及伺服器端用私鑰解密。
··第二個就是用私鑰在客戶端加簽,然後用公鑰在伺服器端使用公鑰解籤。第一種完全是為了加密,第二種是為了防抵賴,就是為了防止別人模仿我們的客戶端來攻擊我們的伺服器,導致癱瘓。
publicCertFilePath:公鑰
encPfxFilePath:私鑰
encPfxFilePwd:私鑰密碼
下面是具體的程式碼:
我們可以看到這個方法是為了對內容進行加簽的,
URLDecoder.decode這個API的目的是對私鑰進行UTF-8格式的字串解碼,指定字符集。
我們通過呼叫SADK包中的方法,對加密進行初始化,通過獲取私鑰的方法:getPrivateKeyFromPFX,我們得到了私鑰priKey。
通過Signature類的p1SignMessage方法來對內容進行加簽並將位元組陣列裝換成字串,Mechanism.SHA1_RSA是模值。
獲取公鑰裡的內容轉換成流,X.509數字證書生成及驗證的國際標準。
Base64.decode 將String轉成位元組陣列
加簽:
KeyGenerator是AES演算法祕鑰生成器類, 然後初始化祕鑰生成器並規定祕鑰大小128位元組,生成一個祕鑰SercretKey,
返回一個基本編碼的字元陣列,key是一個通過AES加密後的祕鑰。這裡的AES是對稱性加密。
基本流程和加簽是差不多的。
Cipher建立密碼器 ,然後初始化,通過cipher.doFinal來對內容進行加密,Base64.encode返回位元組陣列,Base64是一種編碼方式,加密演算法輸出都是byte[] 統一Base64避免出現亂碼。
總結;很多人在開始的時候,能夠理解加簽和解籤是什麼意思,但對加密不是很瞭解會走入誤區,我舉個例子:
我用通過AES對稱加密對內容進行了加密,這是個鎖,但我們想要讓別人開啟這個鎖,就需要通過私鑰進行加密,生成一個鑰匙。別人當獲取到這鑰匙的時候就可以對你加密的內容知道怎麼解密了。
------ 越努力越幸運 每日一部落格