移动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.mzph.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上面才能用,现在才发现主流浏览器都支持.但我的这个插件已经写的差不多了,所…