日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android使用RSA加密實現接口調用時的校驗功能

瀏覽:103日期:2022-09-21 10:59:36

RSA算法是一種非對稱加密算法,那么何為非對稱加密算法呢?

一般我們理解上的加密是這樣子進行的:原文經過了一把鑰匙(密鑰)加密后變成了密文,然后將密文傳遞給接收方,接收方再用這把鑰匙(密鑰)解開密文。在這個過程中,其實加密和解密使用的是同一把鑰匙,這種加密方式稱為對稱加密。

而非對稱加密就是和對稱加密相對,加密用的鑰匙和解密所用的鑰匙,并不是同一把鑰匙。非對稱加密首先會創建兩把鑰匙,而這兩把鑰匙是成對的分別稱為公鑰和私鑰。在進行加密時我們使用公鑰進行加密,而在解密的時候就必須要使用私鑰才能進行解密,這就是非對稱加密算法。

假如使用非對稱加密,甲發送消息給乙,這時候乙會預先創建好兩把鑰匙,私鑰乙自己保存好,然后把公鑰發送給甲,甲使用公鑰對信息進行加密,然后傳給乙。最后乙使用自己的私鑰對數據進行解密。這個過程中,公鑰還是有可能被第三者所截獲,但是不同的是,這個第三者縱然得到了公鑰,也無法解開密文,因為解密密文所需要的私鑰從始至終一直在乙的手里。因此這個過程是安全的。

在一個Android應用中錄音完成后將錄音文件上傳到SpringBoot搭建的后臺接口中。

由于Android應用中沒有登錄功能,所以需要對一串自定義字符串進行加密并傳輸,然后在SpringBoot后臺進行解密驗證。防止上傳接口暴露。

實現

首先在SpringBoot端新建一個RsaUtils工具類

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;import java.io.ByteArrayOutputStream;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Base64;import javax.crypto.Cipher;//java 后端public class RsaUtils { //私鑰 public static String privateKey = '自己生成的私鑰'; //公鑰 private static String publicKey = '自己生成的公鑰'; /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK = 117; /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK = 128; /** * 獲取密鑰對 * * @return 密鑰對 */ public static KeyPair getKeyPair() throws Exception { KeyPairGenerator generator = KeyPairGenerator.getInstance('RSA'); generator.initialize(1024); return generator.generateKeyPair(); } /** * 獲取私鑰 * * @param privateKey 私鑰字符串 * @return */ public static PrivateKey getPrivateKey(String privateKey) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance('RSA'); byte[] decodedKey = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(new String(privateKey.getBytes())); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey); return keyFactory.generatePrivate(keySpec); } /** * 獲取公鑰 * * @param publicKey 公鑰字符串 * @return */ public static PublicKey getPublicKey(String publicKey) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance('RSA'); byte[] decodedKey = Base64.decode(publicKey); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey); return keyFactory.generatePublic(keySpec); } /** * RSA加密 * * @param data 待加密數據 * @param publicKey 公鑰 * @return */ public static String encrypt(String data, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance('RSA'); cipher.init(Cipher.ENCRYPT_MODE, publicKey); int inputLen = data.getBytes().length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offset = 0; byte[] cache; int i = 0; // 對數據分段加密 while (inputLen - offset > 0) { if (inputLen - offset > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset); } out.write(cache, 0, cache.length); i++; offset = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); // 獲取加密內容使用base64進行編碼,并以UTF-8為標準轉化成字符串 // 加密后的字符串 return new String(Base64.encode((encryptedData))); } /** * RSA解密 * * @param data 待解密數據 * @param privateKey 私鑰 * @return */ public static String decrypt(String data, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance('RSA'); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] dataBytes = Base64.decode(data); int inputLen = dataBytes.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offset = 0; byte[] cache; int i = 0; // 對數據分段解密 while (inputLen - offset > 0) { if (inputLen - offset > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(dataBytes, offset, inputLen - offset); } out.write(cache, 0, cache.length); i++; offset = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); // 解密后的內容 return new String(decryptedData, 'UTF-8'); } /** * 簽名 * * @param data 待簽名數據 * @param privateKey 私鑰 * @return 簽名 */ public static String sign(String data, PrivateKey privateKey) throws Exception { byte[] keyBytes = privateKey.getEncoded(); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance('RSA'); PrivateKey key = keyFactory.generatePrivate(keySpec); Signature signature = Signature.getInstance('MD5withRSA'); signature.initSign(key); signature.update(data.getBytes()); return Base64.encode(signature.sign()); } /** * 驗簽 * * @param srcData 原始字符串 * @param publicKey 公鑰 * @param sign 簽名 * @return 是否驗簽通過 */ public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception { byte[] keyBytes = publicKey.getEncoded(); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance('RSA'); PublicKey key = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance('MD5withRSA'); signature.initVerify(key); signature.update(srcData.getBytes()); return signature.verify(Base64.decode(sign)); }/* public static void main(String[] args) { try { // 生成密鑰對 KeyPair keyPair = getKeyPair(); String privateKey = new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded())); String publicKey = new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())); System.out.println('私鑰:' + privateKey); System.out.println('公鑰:' + publicKey); // RSA加密*//* String data = '待加密的文字內容'; String encryptData = encrypt(data, getPublicKey(publicKey)); System.out.println('加密后內容:' + encryptData); // RSA解密 String decryptData = decrypt('encryptData ', getPrivateKey(privateKey)); System.out.println('解密后內容:' + decryptData); // RSA簽名 String sign = sign(data, getPrivateKey(privateKey)); // RSA驗簽 boolean result = verify(data, getPublicKey(publicKey), sign); System.out.print('驗簽結果:' + result);*//* } catch (Exception e) { e.printStackTrace(); System.out.print('加解密異常'); } }*/}

然后運行此工具類的main方法中的生成密鑰對的方法,獲取到生成的公鑰和密鑰對。

Android使用RSA加密實現接口調用時的校驗功能

然后將它們賦值到最上面的privateKey和publicKey。

然后在Android端中也新建一個工具類RsaUtils

package com.badao.badaoimclient.common;import android.util.Base64;import java.io.ByteArrayOutputStream;import java.security.KeyFactory;import java.security.PublicKey;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;public class RsaUtils{ //公鑰 public static String publicKey='跟Java端同樣的公鑰'; /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK = 117; /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK = 128; /** * 獲取公鑰 * * @param publicKey 公鑰字符串 * @return */ public static PublicKey getPublicKey(String publicKey) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance('RSA'); byte[] decodedKey =Base64.decode(publicKey.getBytes(), Base64.DEFAULT); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey); return keyFactory.generatePublic(keySpec); } /** * RSA加密 * * @param data 待加密數據 * @param publicKey 公鑰 * @return */ public static String encrypt(String data, PublicKey publicKey) throws Exception { Cipher cipher ; cipher= Cipher.getInstance('RSA/ECB/PKCS1Padding'); cipher.init(Cipher.ENCRYPT_MODE, publicKey); int inputLen = data.getBytes().length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offset = 0; byte[] cache; int i = 0; // 對數據分段加密 while (inputLen - offset > 0) { if (inputLen - offset > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset); } out.write(cache, 0, cache.length); i++; offset = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); // 獲取加密內容使用base64進行編碼,并以UTF-8為標準轉化成字符串 // 加密后的字符串 return new String(Base64.encode(encryptedData, Base64.DEFAULT)); }}

這里的公鑰與上面生成的公鑰一致。

注意著兩個工具類的區別

在Android工具類中的Base64引入的是

import android.util.Base64;

而在Java中引入的Base64是

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

注意這里為什么不是引用java.util.Base64,因為會有換行導致的轉移字符的問題。

然后在Android中對字符串進行加密

//獲取加密字符串String escode = '';try { escode = RsaUtils.encrypt(key,RsaUtils.getPublicKey(RsaUtils.publicKey)); } catch (Exception e) { e.printStackTrace();}

將其作為接口調用的參數傳遞到Java中進行解密

if(decode.equals(RsaUtils.decrypt(key,RsaUtils.getPrivateKey(RsaUtils.privateKey)))) { try { // 上傳文件路徑 String filePath = RuoYiConfig.getUploadPath(); // 上傳并返回新文件名稱 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); ajax.put('fileName', fileName); ajax.put('url', url); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } }else { return AjaxResult.error('非法訪問'); }

這樣就限制了只能通過指定的移動端對文件上傳接口進行訪問。

在移動端調用接口進行測試

Android使用RSA加密實現接口調用時的校驗功能

可見調用接口前加密成功

并且能用過后臺接口的解密校驗

Android使用RSA加密實現接口調用時的校驗功能

這樣別的第三方請求接口就沒法請求

Android使用RSA加密實現接口調用時的校驗功能

以上就是Android使用RSA加密實現接口調用時的校驗功能的詳細內容,更多關于Android rsa加密接口調用的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美a级一区二区| 欧美日韩高清| 丝袜脚交一区二区| 久久一二三区| 亚洲精品韩国| 91精品啪在线观看国产爱臀| 日韩和欧美的一区| 欧美一区二区三区久久| 日韩动漫一区| 国产精品玖玖玖在线资源| 久久不见久久见中文字幕免费 | 日韩av资源网| 国产精品115| 国产精品免费精品自在线观看| 7m精品国产导航在线| 欧美亚洲二区| 国内在线观看一区二区三区| 国产精品黑丝在线播放| 日韩另类视频| 免费日韩av片| 国产视频一区二| 91青青国产在线观看精品| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲乱码视频| 97成人在线| 精品午夜视频| 亚洲精品网址| 日韩三级久久| 水蜜桃精品av一区二区| 欧美午夜精彩| 久久成人一区| 国产欧美自拍| 色天使综合视频| 三级一区在线视频先锋| 国产日韩免费| 久久久国产亚洲精品| 免费成人在线观看| 国产精品黄网站| 激情婷婷欧美| 青青草国产精品亚洲专区无| 在线天堂资源www在线污| 国产精品日韩久久久| 日韩欧美三区| 日产精品一区二区| 男女精品网站| 国产精品久久免费视频| 久久精品青草| 日韩三区四区| 国产精品毛片一区二区在线看| 99国产成+人+综合+亚洲欧美| 日本欧美久久久久免费播放网| 四季av一区二区凹凸精品| 国产精品婷婷| 久久一区亚洲| 视频一区在线播放| 久久99国产精品视频| 影音国产精品| 国产精品xxx在线观看| 激情欧美一区| 久久超碰99| 欧美日韩国产在线观看网站 | av中文字幕在线观看第一页| 日韩精品一卡二卡三卡四卡无卡| 久久影院资源站| 在线综合视频| 国产一区二区三区四区五区传媒| 六月丁香综合| 伊人久久国产| 欧美视频久久| 午夜精品免费| 精品一区二区三区视频在线播放| 亚洲免费影视| 日韩国产综合| 日韩av网站在线免费观看| 99tv成人| 久久av国产紧身裤| 六月天综合网| 欧美一区二区三区激情视频 | 精品视频一区二区三区四区五区| 视频一区中文字幕| 桃色一区二区| 麻豆视频一区| 日韩精品成人在线观看| 一区二区亚洲精品| 国产色播av在线| 国产精品资源| 亚洲欧美激情诱惑| 日韩免费高清| 免费看久久久| 日本国产欧美| 免费人成黄页网站在线一区二区| а√天堂中文在线资源8| 久久激情五月激情| 免费人成精品欧美精品| 欧美a级一区| 久草免费在线视频| 精品国产鲁一鲁****| 欧美在线不卡| 最新国产精品| 水蜜桃久久夜色精品一区的特点| 日韩电影免费在线观看| 国产精品日本一区二区三区在线| 亚洲精品无播放器在线播放| 在线视频日韩| 亚洲激情国产| 激情欧美一区| 成人亚洲欧美| 国产成人精品免费视| 老色鬼精品视频在线观看播放| 欧美一区免费| 欧美日韩夜夜| 日本午夜精品一区二区三区电影 | 91精品丝袜国产高跟在线| 亚洲日产av中文字幕| 欧美在线资源| 激情五月色综合国产精品| 99久久99视频只有精品| 91精品国产91久久久久久黑人| 久久久久.com| 久久九九99| 欧美日韩激情在线一区二区三区| 国产一区视频在线观看免费| 三级小说欧洲区亚洲区| 久久久久免费av| 99精品网站| 中文日韩在线| 蜜臀av性久久久久蜜臀aⅴ流畅 | 视频一区二区三区入口| 日韩亚洲国产欧美| 国产精品毛片一区二区三区| 中文日韩欧美| 日韩中文av| 日韩精品社区| 国产欧美久久一区二区三区| 欧美激情 亚洲a∨综合| 国内不卡的一区二区三区中文字幕 | 日韩中文字幕91| 亚洲少妇一区| 亚欧成人精品| 国产精品嫩模av在线| 精品国内亚洲2022精品成人| 精品视频自拍| 亚洲爱爱视频| 亚洲一区二区三区高清| 日韩中文字幕一区二区高清99| 国产精品自拍区| 色一区二区三区四区| 亚洲小说欧美另类婷婷| 99视频+国产日韩欧美| 男人的天堂久久精品| 日韩精品亚洲一区二区三区免费| 国产精品网站在线看| 国产白浆在线免费观看| 蜜桃成人av| 亚洲图片久久| 国产精品欧美在线观看| 成人在线超碰| 精品欧美久久| 欧美日韩一区自拍| 久久久男人天堂| 亚洲欧美日韩国产综合精品二区 | 桃色一区二区| 免费一级片91| 你懂的国产精品永久在线| 亚洲成av人片一区二区密柚| 亚洲专区视频| 成人精品高清在线视频| 婷婷色综合网| 日韩久久一区| 国产成人免费| 亚洲一区二区三区高清不卡| 国产精品久久国产愉拍| 伊人精品一区| 欧美啪啪一区| 伊人精品一区| 国产精品久久久久久久久久齐齐 | 日本伊人午夜精品| 国产一二在线播放| 亚洲精品激情| 亚洲天堂资源| 日韩精品一区二区三区免费视频| 久久精品国产福利| 亚洲综合电影一区二区三区| 国产精品sss在线观看av| 欧美日韩一二三四| 国产精品巨作av| 午夜久久99| 麻豆精品在线观看| 麻豆精品91| 在线看片福利| 青青国产精品| 黄色成人精品网站| 久久精品一区| 综合精品一区| 欧洲一区二区三区精品| 欧美一级二区| 91精品国产福利在线观看麻豆| 18国产精品| aa亚洲婷婷| 日韩欧美另类一区二区|