加簽驗籤是為了驗證接收到的資料的真實性問題,但此次我的應用場景是這樣的:
因為要從乙個系統傳送http請求到另乙個系統的網域名稱上去獲取相應的資料,但是被請求的這個網域名稱是外網網域名稱(任何人都能通過請求這個網域名稱位址來獲取資料),所以簡單的使用簽名來做一下校驗,驗籤不通過的請求則不允許獲取資料。下面是具體的實踐:
其中公鑰是用來驗籤,私鑰用來加簽,在上圖中我在獲取公私鑰之後都對其進行了base64編碼,轉成string型別,這樣做的原因是就可以儲存在你想要儲存的地方了,我是儲存在了公司的配置中心上,通過配置中心獲取的,當然也可以儲存在靜態變數中,但是建議設定為final,畢竟這個金鑰對生成之後就不會再變化了。否則不配對的金鑰對是無法進行正確的加簽驗籤操作的。
由於我這只是實驗**,就簡單的設定乙個變數來存放了:
由於之前對金鑰做了base64的編碼,首先要做的就是先將其解碼
還原公鑰(儲存在資料提供方,用於驗籤):
x509encodedkeyspec pubkeyspec = new x509encodedkeyspec (pubkeybytes);
publickey publickey = keyfactory.generatepublic(pubkeyspec);還原私鑰(儲存在資料請求方,用於加簽):
pkcs8encodedkeyspec prikeyspec = new pkcs8encodedkeyspec(prikeybytes);
privatekey privatekey = keyfactory.generateprivate(prikeyspec);因為要將生成的簽名也當作引數傳到資料提供端,故對sign進行base64編碼。
這裡有乙個注意點,在做資料傳輸的過程中會存在乙個轉義問題,因為在進行資料請求端做完加籤得到的簽名中往往都會包含有『+』號字元,通過http傳輸過來的時候往往會將'+'號轉義為空格,導致驗籤始終是失敗的(你想想,長度不一樣怎麼可能驗籤成功),所以在生成簽名之後,需要對'+'號做一下特殊處理:
signstr.replaceall("\\+", "%2b");
RSA 加密 解密 加簽 驗籤
1.公鑰與私鑰碼生成 2.獲取公鑰 獲取公鑰 return private publickey getpublickey catch exception e 獲取私鑰 獲取私鑰 return private privatekey getprivatekey catch exception e bas...
PHP實現RSA加密,解密,加簽,驗籤
公鑰用於對資料進行加密,私鑰用於對資料進行解密 私鑰用於對資料進行簽名,公鑰用於對簽名進行驗證。封裝的rsa 如下 class rsa 設定私鑰 this keypath path file this keypath directory separator rsa private key.pem p...
使用RSA對資料進行加解密及驗籤操作
最近工作中遇到rsa加密操作,公私鑰知識自行腦補,廢話不多說,直接上 傳送方 string data asda 需加籤 加密的資料 system.out.println 源資料 data 生成私鑰 keypairgenerator kpgen keypairgenerator.getinstance...