移动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 = "";
- 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);
- }
- }
非对称加密RSA(RSA是他们的发明人的姓氏开头字母拼在一起组成的)
采用第三方工具生成一对密钥对(公钥和私钥)
加密方式分为两种:
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(, 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);
- }
- }
移动APP接口安全性设计的更多相关文章
- 基于Java的REST架构风格及接口安全性设计的讨论
1.REST即表现层状态传递(Representational [,rɛprɪzɛn'teʃnl] State Transfer,简称REST). (1)REST名词解释: 通俗来讲就是资源在网络中以 ...
- API接口安全性设计
http://www.jianshu.com/p/c6518a8f4040 接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来 ...
- Java++:安全|API接口安全性设计
接口的安全性主要围绕 token.timestamp 和 sign 三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制: 用户使用用户名密码登录后服务器给客户端返 ...
- 【转】App架构设计经验谈:接口的设计
App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用REST ...
- App接口设计
关于APP接口设计 http://blog.csdn.net/gebitan505/article/details/37924711/
- PHP做APP接口时,如何保证接口的安全性??????????
PHP做APP接口时,如何保证接口的安全性? 1.当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在sess ...
- App版本更新接口的设计
前段时间公司业务调整,新开了新的移动端的项目,所以和朋友聊到了“版本号”和“版本更新所需的数据表设计”. 一般来讲大部分的软件版本号分3段,比如 A.B.C A 表示大版本号,一般当软件整体重写,或出 ...
- 关于APP接口设计(转)
最近一段时间一直在做APP接口,总结一下APP接口开发过程中的注意事项: 1.效率:接口访问速度 APP有别于WEB服务,对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所 ...
- 关于APP接口设计
最近一段时间一直在做APP接口,总结一下APP接口开发过程中的注意事项: 1.效率:接口访问速度 APP有别于WEB服务,对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所 ...
随机推荐
- Frightful Formula Gym - 101480F (待定系数法)
Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...
- 014_matlab读取ecxel(直接导入)
视频教程:https://v.qq.com/x/page/c3039b5htwx.html 资料下载:https://download.csdn.net/download/xiaoguoge11/12 ...
- 利用python画小猪佩奇
import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink&quo ...
- yugabyte 安装pg extention
前段时间在学习yugabyte 发现yugabyte 是直接复用了pg server的源码,所以当时就觉得大部分pg extension 也是可用. 今天看到了官方文档中有关于如何安装的,发现还得多看 ...
- 洛谷P2949题解
若想要深入学习反悔贪心,传送门. Description: 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多 ...
- 【POJ1416】Shredding Company
本题传送门 本题知识点:深度优先搜索 + 回溯 本题题意很简单,就是有一条位数不超过6的数字纸条,问你怎么剪这纸条,使得得到的纸条的值的总和最接近目标值(总和不能超过目标值). 比如第一个样例 50 ...
- 第08组 Alpha冲刺(6/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11913269.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- html 选择本地图片,显示选择的图片
主要用的是html5的文件系统部分: <html> <head> <meta name="viewport" content="width= ...
- E4A碰到打开自动闪退又自动打开又闪退一直循环的问题
E4A碰到打开自动闪退又自动打开又闪退一直循环的问题 这几天写了一个脚本,自己手机上,模拟器上,均测试没有问题,可以正常操作 发给另一个人,他那边居然没有一个设备能运行成功! 而且一直闪退,闪退后又打 ...
- [Beta]Scrum Meeting#8
github 本次会议项目由PM召开,时间为5月13日晚上10点30分 时长10分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 为适应新功能调整布局 ...