網(wǎng)絡(luò)數(shù)據(jù)的傳輸一般都是用對(duì)稱(chēng)加密算法
非對(duì)稱(chēng)加密算法因?yàn)樾实膯?wèn)題只用來(lái)加密 對(duì)稱(chēng)加密算法 的秘鑰和 用于 數(shù)字簽名
案例
- AES 對(duì)稱(chēng)加密算法
- RSA 非對(duì)稱(chēng)加密算法
操作前 服務(wù)器和客戶(hù)端都已擁有雙方的公鑰
Android的RSA公鑰-->發(fā)送給服務(wù)器用
服務(wù)器的RSA公鑰-->發(fā)送給客戶(hù)端用
單項(xiàng)驗(yàn)證
如客戶(hù)端驗(yàn)證服務(wù)器的真實(shí)性
Android客戶(hù)端(擁有AES秘鑰)
使用 非對(duì)稱(chēng)加密算法即 服務(wù)器的RSA公鑰 對(duì)Android客戶(hù)端的AES的秘鑰進(jìn)行加密
然后 Http Get請(qǐng)求 并發(fā)送Android客戶(hù)端的AES秘鑰給服務(wù)器
服務(wù)器收到請(qǐng)求后,使用自己的RSA私鑰對(duì)請(qǐng)求解密 獲取到Android的AES秘鑰,然后把發(fā)送給Android客戶(hù)端的數(shù)據(jù)如 byte [] datas進(jìn)行簽名即sign
把sign和datas 一起用Android客戶(hù)端的AES秘鑰進(jìn)行加密,然后發(fā)送給Android客戶(hù)端
Android客戶(hù)端收到后,再用自己的AES秘鑰把整個(gè)數(shù)據(jù)包解密,此時(shí)進(jìn)行數(shù)據(jù)分離,獲取到sign和datas,然后對(duì)sign進(jìn)行驗(yàn)證,驗(yàn)證方法就是用服務(wù)器的公鑰配合參數(shù)sign進(jìn)行簽名驗(yàn)證
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initVerify(pubKey); //使用服務(wù)器發(fā)給客戶(hù)端的公鑰
boolean flag = signatrue.verify(sign);
注意事項(xiàng)
服務(wù)器的RSA私鑰進(jìn)行簽名 sign,因?yàn)閟ign的長(zhǎng)度是固定的(和初始化的秘鑰長(zhǎng)度相等),故很容易進(jìn)行數(shù)據(jù)分離
如解密后進(jìn)行str.substring()可以分離 datas和sign