日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android+Java中使用RSA加密实现接口调用时的校验功能

發(fā)布時間:2025/3/19 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android+Java中使用RSA加密实现接口调用时的校验功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

場景

RSA加密

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

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

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

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

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

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

注:

博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號
霸道的程序猿
獲取編程相關(guān)電子書、教程推送與免費下載。

實現(xiàn)

首先在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 待加密數(shù)據(jù)* @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;// 對數(shù)據(jù)分段加密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();// 獲取加密內(nèi)容使用base64進(jìn)行編碼,并以UTF-8為標(biāo)準(zhǔn)轉(zhuǎn)化成字符串// 加密后的字符串return new String(Base64.encode((encryptedData)));}/*** RSA解密** @param data 待解密數(shù)據(jù)* @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;// 對數(shù)據(jù)分段解密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();// 解密后的內(nèi)容return new String(decryptedData, "UTF-8");}/*** 簽名** @param data 待簽名數(shù)據(jù)* @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 = "待加密的文字內(nèi)容";String encryptData = encrypt(data, getPublicKey(publicKey));System.out.println("加密后內(nèi)容:" + encryptData);// RSA解密String decryptData = decrypt("encryptData ", getPrivateKey(privateKey));System.out.println("解密后內(nèi)容:" + decryptData);// RSA簽名String sign = sign(data, getPrivateKey(privateKey));// RSA驗簽boolean result = verify(data, getPublicKey(publicKey), sign);System.out.print("驗簽結(jié)果:" + result);*//*} catch (Exception e) {e.printStackTrace();System.out.print("加解密異常");}}*/}

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

然后將它們賦值到最上面的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 待加密數(shù)據(jù)* @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;// 對數(shù)據(jù)分段加密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();// 獲取加密內(nèi)容使用base64進(jìn)行編碼,并以UTF-8為標(biāo)準(zhǔn)轉(zhuǎn)化成字符串// 加密后的字符串return new String(Base64.encode(encryptedData, Base64.DEFAULT));}}

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

注意著兩個工具類的區(qū)別

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

import android.util.Base64;

而在Java中引入的Base64是

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

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

然后在Android中對字符串進(jìn)行加密

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

將其作為接口調(diào)用的參數(shù)傳遞到Java中進(jìn)行解密

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("非法訪問");}

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

在移動端調(diào)用接口進(jìn)行測試

可見調(diào)用接口前加密成功

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

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

總結(jié)

以上是生活随笔為你收集整理的Android+Java中使用RSA加密实现接口调用时的校验功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 青青草原在线免费观看视频 | 性欧美18一19性猛交 | 成人黄色国产 | 99视频只有精品 | 男女污污视频在线观看 | 欧美日韩精品久久 | 女人又爽又黄免费女仆 | 精品国产精品国产偷麻豆 | 亚洲免费福利 | 亚洲色成人www永久在线观看 | 久久发布国产伦子伦精品 | 偷偷在线观看免费高清av | 偷拍亚洲精品 | 亚洲操图 | sao虎视频在线精品永久 | 国产午夜视频在线播放 | 在线播放无码后入内射少妇 | 刘亦菲一区二区三区免费看 | 午夜免费福利 | 在线黄色av | 四虎成人在线视频 | 奇米影视久久久 | 久久美女视频 | 国产精品久久久久久久久久久久久久久久久 | 青青草在线播放 | 国产91在线高潮白浆在线观看 | 日本成人动漫在线观看 | 国产一级淫片免费 | 无码人妻精品一区二区中文 | 国产农村妇女精品一区二区 | 夜夜嗨av色一区二区不卡 | 欧美一区二区三区婷婷月色 | 人妻 丝袜美腿 中文字幕 | 色视频线观看在线播放 | 亚洲一线二线在线观看 | 性色一区二区 | 日韩精品欧美精品 | 午夜88| 亚洲自拍偷拍网站 | 污污内射久久一区二区欧美日韩 | 香蕉一区二区 | 男女无遮挡做爰猛烈视频 | 久久久久久久久久国产精品 | 草莓视频在线观看入口w | 综合精品视频 | 少妇愉情理伦片bd | 香蕉a视频 | 欧美日韩中文字幕 | 刘亦菲毛片一区二区三区 | 国产高潮视频在线观看 | 久久高清| 亚洲婷婷免费 | 欧美高清hd19 | 国产综合视频在线观看 | 色成人综合| 国产福利久久 | 欧美做爰xxxⅹ性欧美大片 | av巨作 | 欧美网站免费 | 免费中文av | 国产日韩欧美一区 | 欧美性受黑人性爽 | 婷婷综合五月 | 成年人午夜免费视频 | 夜夜添无码一区二区三区 | 免费观看污| 亚洲中字幕 | 91成人网页 | 波多野吉衣久久 | 久久伊人婷婷 | 情侣黄网站免费看 | 国产精品-区区久久久狼 | 国产精品羞羞答答 | 樱花视频在线免费观看 | 欧美成人精精品一区二区频 | 成人快色 | 后进极品美女白嫩翘臀 | 亚洲一区区 | 久久国产精品免费观看 | 在线免费观看黄色小视频 | 乱色精品无码一区二区国产盗 | 久久综合久色欧美综合狠狠 | 日韩综合另类 | 国产一级做a爱免费视频 | 激情av在线播放 | 欧美精品一区二区免费看 | 玩弄人妻少妇500系列 | 女女互慰揉小黄文 | 成人91在线观看 | 蜜桃精品噜噜噜成人av | 国产乱人乱精一区二视频国产精品 | 青青草免费观看 | 欧美一区二区三区久久妖精 | 日韩成人一区二区 | 欧美xxxx黑人又粗又长密月 | 6699嫩草久久久精品影院 | 91福利视频网站 | 国产a国产片 | 少妇人妻偷人精品一区二区 |