移動APP接口安全性設計

移動APP接口是怎么保證安全性的,可以采用https,或者是非對稱加密。

接口加密的目的是防止被別人用抓包工具,抓包后篡改數據。

關于加密算法常見的有對稱加密(DES)和非對稱加密(RSA)

對稱加密(DES):加密和解密用的是同一個密鑰

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;/*** DES加密介紹 DES是一種對稱加密算法,所謂對稱加密算法即:加密和解密使用相同密鑰的算法。DES加密算法出自IBM的研究,*/
public class DES {public DES() {}// 測試public static void main(String args[]) throws Exception {// 待加密內容String str = "irish";// 密碼,長度要是8的倍數 密鑰隨意定String password = "95881221";byte[] encrypt = encrypt(str.getBytes(), password);System.out.println("加密后:" + new String(encrypt));// 解密byte[] decrypt = decrypt(encrypt, password);System.out.println("解密后:" + new String(decrypt));}/*** 加密* * @param datasource byte[]* @param password   String* @return byte[]*/public static byte[] encrypt(byte[] datasource, String password) {try {SecureRandom random = new SecureRandom();DESKeySpec desKey = new DESKeySpec(password.getBytes());// 創建一個密匙工廠,然后用它把DESKeySpec轉換成SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey securekey = keyFactory.generateSecret(desKey);// Cipher對象實際完成加密操作Cipher cipher = Cipher.getInstance("DES");// 用密匙初始化Cipher對象,ENCRYPT_MODE用于將 Cipher 初始化為加密模式的常量
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);// 現在,獲取數據并加密// 正式執行加密操作return cipher.doFinal(datasource); // 按單部分操作加密或解密數據,或者結束一個多部分操作} catch (Throwable e) {e.printStackTrace();}return null;}/*** 解密* * @param src      byte[]* @param password String* @return byte[]* @throws Exception*/public static byte[] decrypt(byte[] src, String password) throws Exception {// DES算法要求有一個可信任的隨機數源SecureRandom random = new SecureRandom();// 創建一個DESKeySpec對象DESKeySpec desKey = new DESKeySpec(password.getBytes());// 創建一個密匙工廠SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 返回實現指定轉換的// 將DESKeySpec對象轉換成SecretKey對象SecretKey securekey = keyFactory.generateSecret(desKey);// Cipher對象實際完成解密操作Cipher cipher = Cipher.getInstance("DES");// 用密匙初始化Cipher對象
        cipher.init(Cipher.DECRYPT_MODE, securekey, random);// 真正開始解密操作return cipher.doFinal(src);}
}

?

非對稱加密RSARSA他們的發明人的姓氏開頭字母拼在一起組成的

采用第三方工具生成一對密鑰對(公鑰和私鑰)

加密方式分為兩種:

1如果用公鑰加密,必須采用私鑰解密

2如果用私鑰加密,必須采用公鑰解密

移動APP接口采用RSA加密的話,移動APP保存公鑰,服務器端保存私鑰

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;import org.apache.commons.codec.binary.Base64;/*** RSA加解密工具類* **/
public class RSAUtil {public static String publicKey; // 公鑰public static String privateKey; // 私鑰/*** 生成公鑰和私鑰*/public static void generateKey() {// 1.初始化秘鑰
        KeyPairGenerator keyPairGenerator;try {keyPairGenerator = KeyPairGenerator.getInstance("RSA");SecureRandom sr = new SecureRandom(); // 隨機數生成器keyPairGenerator.initialize(512, sr); // 設置512位長的秘鑰KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 開始創建RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();// 進行轉碼publicKey = Base64.encodeBase64String(rsaPublicKey.getEncoded());// 進行轉碼privateKey = Base64.encodeBase64String(rsaPrivateKey.getEncoded());} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}/*** 私鑰匙加密或解密* * @param content* @param privateKeyStr* @return*/public static String encryptByprivateKey(String content, String privateKeyStr, int opmode) {// 私鑰要用PKCS8進行處理PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));KeyFactory keyFactory;PrivateKey privateKey;Cipher cipher;byte[] result;String text = null;try {keyFactory = KeyFactory.getInstance("RSA");// 還原Key對象privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);cipher = Cipher.getInstance("RSA");cipher.init(opmode, privateKey);if (opmode == Cipher.ENCRYPT_MODE) { // 加密result = cipher.doFinal(content.getBytes());text = Base64.encodeBase64String(result);} else if (opmode == Cipher.DECRYPT_MODE) { // 解密result = cipher.doFinal(Base64.decodeBase64(content));text = new String(result, "UTF-8");}} catch (Exception e) {// TODO Auto-generated catch block
            e.printStackTrace();}return text;}/*** 公鑰匙加密或解密* * @param content* @param privateKeyStr* @return*/public static String encryptByPublicKey(String content, String publicKeyStr, int opmode) {// 公鑰要用X509進行處理X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));KeyFactory keyFactory;PublicKey publicKey;Cipher cipher;byte[] result;String text = null;try {keyFactory = KeyFactory.getInstance("RSA");// 還原Key對象publicKey = keyFactory.generatePublic(x509EncodedKeySpec);cipher = Cipher.getInstance("RSA");cipher.init(opmode, publicKey);if (opmode == Cipher.ENCRYPT_MODE) { // 加密result = cipher.doFinal(content.getBytes());text = Base64.encodeBase64String(result);} else if (opmode == Cipher.DECRYPT_MODE) { // 解密result = cipher.doFinal(Base64.decodeBase64(content));text = new String(result, "UTF-8");}} catch (Exception e) {// TODO Auto-generated catch block
            e.printStackTrace();}return text;}public static void main(String[] args) {// 1. 生成(公鑰和私鑰)密鑰對
        RSAUtil.generateKey();System.out.println("公鑰:" + RSAUtil.publicKey);System.out.println("私鑰:" + RSAUtil.privateKey);System.out.println("----------公鑰加密私鑰解密-------------");// 使用 公鑰加密,私鑰解密String textsr = "irish";String encryptByPublic = RSAUtil.encryptByPublicKey(textsr, RSAUtil.publicKey, Cipher.ENCRYPT_MODE);System.out.println("公鑰加密:" + encryptByPublic);String text = RSAUtil.encryptByprivateKey(encryptByPublic, RSAUtil.privateKey, Cipher.DECRYPT_MODE);System.out.print("私鑰解密:" + text);}}

?

轉載于:https://www.cnblogs.com/moris5013/p/11186157.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448330.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448330.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

掉頭

掉頭技巧 掉頭前打左燈、減速(至五公里左右)甚至停下,注意觀察路況,同時密切注意來往車輛情況(尤其是遠一點但車速快的),必要時停車等待。操作方法 1、在較寬廣的道路上,應盡量地應用大遇回一次順車掉頭。如在有交通指揮人…

深入理解 Git 的實現原理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我一直很佩服能靜心細讀各種官方文檔的人,此文轉自:https://www.cnblogs.com/mamingqian/p/9711975.html 原作者…

STL之容器小結

一、理論提高:所有容器提供的都是值(value)語意,而非引用(reference)語意。容器執行插入元素的操作時,內部實施拷貝動作。所以STL容器內存儲的元素必須能夠被拷貝(必須提供拷貝構造函…

超車

概念 超車,即車輛經過另一輛車的側面,從后面超過前面同方向行駛的車輛。用于超車的車道一般為內側車道,即較接近道路中心而離路肩較遠的車道。在靠右行駛的地區,超車道為靠左的車道;在靠左行駛的地區,超車道為靠右的…

STL之函數對象和謂詞

1.函數對象 重載函數調用操作符的類,其對象常稱為函數對象(function object),即它們是行為類似函數的對象。一個類對象,表現出一個函數的特征,就是通過“對象名(參數列表)”的方式使用一個類對象&#xff…

安裝 Git ( Windows、linux、Mac)

安裝 Git 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 是時候動手嘗試下 Git 了,不過得先安裝好它。有許多種安裝方式,主要分為兩種,一種是通過編…

會車

概念 會車,即反向行駛的列車、汽車等同時在某一地點交錯通過。 會車攻略 一看,看對向來車的車型、速度和裝載情況,前方道路的寬度、堅實情況,路旁行人、車輛情況,路旁停車以及障礙物情況等; 二算,…

FormsAuthenticationTicket基于forms的驗證

構建基于forms的驗證機制過程如下: 1,設置IIS為可匿名訪問和asp.net web.config中設置為form驗證 2,檢索數據存儲驗證用戶,并檢索角色(如果不是基于角色可不用) 3,使用FormsAuthenticationTicket創建一個Cookie并回發到客戶端,并存儲 角色到票…

通過公共汽車站

要求 通過班車站,應降低速度慢行,掛一擋通過,注意左右仔細查看。操作方法 1、減速慢行,注意觀察公共汽車周圍的交通情況,以防突然情況的出現; 2、在超越公共汽車時,注意提防公共汽車起步后突然向左轉…

STL之函數適配器

1.理論知識 2.常用函數適配器 標準庫提供一組函數適配器,用來特殊化或者擴展一元和二元函數對象。常用適配器是: 1綁定器(binder): binder通過把二元函數對象的一個實參綁定到一個特殊的值上,將其轉換成一元函數對象…

真正理解 git fetch, git pull 以及 FETCH_HEAD

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 真正理解 git fetch, git pull 要講清楚git fetch,git pull,必須要附加講清楚git remote,git merge 、遠程rep…

pyqt5 + pyinstaller 制作爬蟲小程序

環境:mac python3.7 pyqt5 pyinstaller ps: 主要是熟悉pyqt5, 加入了單選框 輸入框 文本框 文件夾選擇框及日歷下拉框 效果圖: pyqt5 主程序文件 # -*- coding: utf-8 -*- # Author: Mehaei # Date: 2019-07-10 13:02:56 # Last Modified by: Mehaei # Last Modified time…

通過學校區域

通過學校區域的要求 應觀察前后左右的交通情況,適時減速慢行,不得鳴喇叭和與學生搶行。 操作方法 當駕駛車輛行至學校附近或有注意兒童標志路段時,一定要及時減速,注意觀察道路兩側或周圍的情況,時刻堤防學生橫…

axios中出現兩次請求,OPTIONS請求和GET請求

在項目中發現ajax中出現兩次請求,OPTIONS請求和GET請求 查看到瀏覽器NetWork有兩次請求,請求url一樣: 查找原因是瀏覽器對簡單跨域請求和復雜跨域請求的處理區別。 XMLHttpRequest會遵守同源策略(same-origin policy). 也即腳本只能訪問相同協…

筆試面試收獲(持續更新中)

1. Internet 是有ARPANET發展而來 2. NFS(Network File System)即網絡文件系統 3. OSI參考模型七層:物理層,數據鏈路層,網絡層(IP,路由器,三層交換機),傳輸層&#xff…

Linux 安裝 配置 Maven

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.需要提前安裝JDK,并且配置環境變量 請參考:https://blog.csdn.net/jiangyu1013/article/details/84321146 2.…

Threading in C#

這里推薦一些C#編程多線程的學習資料: http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html Ebook in English:http://cid-068f7d75d8585700.skydrive.live.com/self.aspx/ebook/threading.pdf 一些demo:http://cid-068f7…

經理人如何與這“六種人”打交道?

在職場中,我們要與不同身份、不同年齡、不同崗位、不同性別、不同性格的人打交道。在平時的實際工作接觸中,善于與不同人打交道的經理人,會根據不同的情況用不同的態度和方式來對待之。 1、如何與死板的人打交道 與這樣的人交往&#xff0c…

[Git高級教程 (一)] 通過 Tag 標簽回退版本修復 bug

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1 前言 本系列之所以取名”Git高級教程”,主要是教大家解決實際工作中遇到的問題,要求讀者會基本的Git用法和命令…

Javascript 自定義輸出

緣由 前段時間再看了一些javascript的學習資料,也寫的一些demo,在輸出的時候一般都用alert,但這個方法會打斷函數運行,用起來不是很好.還有就是console.log這個方法,這種方法原來一直以為只能在FireFox上面才能用,現在才發現主流瀏覽器都支持.但我的這個插件已經寫的差不多了,所…