android接口加密实现方案

2023-11-17

 

Fiddler抓包工具配置

android接口如何防抓取

Windows下使用OpenSSL生成RSA证书

文中使用的加密库

 

1.程序主类

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.EditText;
import com.wyq.encrypt.method.Encrypt;
import com.wyq.encrypt.method.EncryptFactory;
import java.util.Random;

/**
 * 实现方案/思路:
 * Android端的加密需要4步:
 * 1.随机生成AES密钥
 * 2.根据AES秘钥对数据进行加密
 * 3.使用RSA公钥加密刚刚生成的AES密钥
 * 4.将AES加密过的数据  和  被RSA加密过的AES秘钥  传给服务端
 * <p>
 * 服务端的解密只需3步:
 * 1.获取到客户端传过来的数据
 * 2.使用RSA私钥解密从客户端拿到的“被RSA加密过的AES秘钥”
 * 3.再使用解密出来的AES秘钥来解密被AES加密过的数据
 * <p>
 * 这里需要理解的地方:
 * 1.RSA是公开秘钥系统的代表,可以通过OpenSSL生成RSA证书,拿到公钥和私钥。
 * 2.RSA的公钥用来加密,私钥用来解密。可以这样理解:客户端锁了门,钥匙在服务端那里。
 * 3.RSA加/解密速度慢,不适合大量的数据进行加/解密,它是不对称加密方式。
 * 4.AES加密速度很快,它是对称密码方式,即加密和解密使用同一个密钥的加密方式。
 * <p>
 * 理解了以上之后,我们就很容易想到使用RSA+AES相结合的方式,发挥它们共同的优点来实现一种新的数据加密方案
 */

public class MainActivity extends AppCompatActivity {

    // 使用OpenSSL生成的RSA私钥 (存放于服务端)
    private final static String private_key = "MIICXQIBAAKBgQDj6Bo3w/9rTeTzefIPj6/aooiVzzhgplwQxMabLIBLIWMoGBd0" +
            "6VZKI08h0cqRx93KmuKZ8UJuubLAjDyGEi0BPP/Mx9m9nFqFPK8zxeO9dGQRMCy6" +
            "udnbTRTBIJGvh4MOfY/LuDFUf6APh6lj+TzLElrnlis3xz5vB6mvuwicmQIDAQAB" +
            "AoGAfVZGJOkLbS3XffdQojI5WhoM16awsKaM90PgnbIplCf2ajRlogw5QmiMumKv" +
            "7uBmH2hyuoquKErD/ZSiLHGOgZgZV012MernqRV/ysg9B3rXm82RusSeR7WeCxnn" +
            "R4FJzE+J9iw5Qgb5FZF8EFifpAZRSo+oD/TxbGrmmRlIUQECQQD2W2sl66Ll1Abq" +
            "REdBBcyWuNesphoa72MnZWyj11deVsBPoitAVpchorJHotx6NElV6WVqpID0TSXR" +
            "P86JTvvJAkEA7NPN2HDUQmWtsIYcjE/i6rdSw1dKs9j61wQIgGeLOeJEtX2lT50o" +
            "DMhGHof8j2JPbyfCvf8J636JjDG9K2hiUQJARc8z9qPmHjBN4VaFxnQpPFCWtRLA" +
            "dP9+3mwMNAVSeaYliqtOjEW9P8fFsy0AQxTL7y9bELQa4p915uyozxn1mQJBAIlm" +
            "zUvhElU/dsku1gtWIfo5yEvLLm0v20C6d1BAQteffmup7SpGrMDVxVDbZt2tlRaR" +
            "g/wFpzS5IoZzKSSxGDECQQDWGRPPBbFArXARsonA5p9qsFl/e2fjPIrYedH+7JJJ" +
            "VGNHRmQvMh9TjmOjtThmX56jg2l/rrn6l9K6razSSGBl";

    // 使用OpenSSL生成的RSA公钥 (存放于客户端)
    private final static String rsa_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDj6Bo3w/9rTeTzefIPj6/aooiV" +
            "zzhgplwQxMabLIBLIWMoGBd06VZKI08h0cqRx93KmuKZ8UJuubLAjDyGEi0BPP/M" +
            "x9m9nFqFPK8zxeO9dGQRMCy6udnbTRTBIJGvh4MOfY/LuDFUf6APh6lj+TzLElrn" +
            "lis3xz5vB6mvuwicmQIDAQAB";

    /**
     * 获取一个随机key
     *
     * @return
     */
    private String getRandomKey() {
        String key = new String();
        for (int i = 0; i < 32; i++) {
            key = key + new Random().nextInt(10);
        }
        return key;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 账号密码的输入框
         */
        EditText etId = findViewById(R.id.etId);
        EditText etPassword = findViewById(R.id.etPassword);
        etId.setText("admin");
        etPassword.setText("test123456");

        // 客户端加密
        clientEncryption(etId.getText().toString(), etPassword.getText().toString());
    }

    /**
     * 客户端加密账号和密码,并传值给服务端
     * id:账号
     * password:密码
     */
    private void clientEncryption(String id, String password) {
        // 客户端随机生成一个AES秘钥
        String aesKey = getRandomKey();
        Log.i("TAG", "随机生成的AES秘钥:" + aesKey);

        // 经过客户端加密过后的:账号和密码字符串
        Encrypt encrypt = EncryptFactory.create(Encrypt.EncryptType.AES);
        String encryptId = encrypt.encryptString(aesKey, id);
        String encryptPassword = encrypt.encryptString(aesKey, password);
        Log.i("TAG", "加密库最终用到的秘钥:" + encrypt.getKey());
        // 根据RSA的公钥,先对随机产生的AES秘钥进行加密
        String encryptAesKey = EncryptFactory.create(Encrypt.EncryptType.RSA).encryptString(rsa_public_key, aesKey);

        Log.i("TAG", "被加密过的AES秘钥:" + encryptAesKey);
        Log.i("TAG", "客户端传值给服务端:\n账密:" + encryptId + "\n密码:" + encryptPassword);
        Log.i("TAG", ">>>>>>>>>>>>>>>>>>>>>>>>>>");
        Log.i("TAG", ">>>>>>>>>>>>>>>>>>>>>>>>>>");
        Log.i("TAG", ">>>>>>>>>>>>>>>>>>>>>>>>>>");
        // 传值给服务端,并且服务端进行解密
        serverDecryption(encryptId, encryptPassword, encryptAesKey);
    }

    /**
     * 服务端解密来自客户端的账号和密码
     * encryptId:加密过的账号
     * encryptPassword:加密过的密码
     * encryptAesKey:加密过的AES密钥
     */
    private void serverDecryption(String encryptId, String encryptPassword, String encryptAesKey) {
        /**
         * 根据RSA的私钥进行解密,拿到AES的秘钥
         */
        String decryptAesKey = EncryptFactory.create(Encrypt.EncryptType.RSA).decryptString(private_key, encryptAesKey);
        Log.i("TAG", "被解密过的AES秘钥:" + decryptAesKey);
        /**
         * 根据AES秘钥对账号和密码进行AES解密,拿到原文
         */
        Encrypt encrypt = EncryptFactory.create(Encrypt.EncryptType.AES);
        String decryptId = encrypt.decryptString(decryptAesKey, encryptId);
        String decryptPassword = encrypt.decryptString(decryptAesKey, encryptPassword);
        Log.i("TAG", "服务端解密出来的数据,账号:" + decryptId + "  密码:" + decryptPassword);
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android接口加密实现方案 的相关文章

随机推荐

  • BurpSuite武器库打造之环境搭建和API介绍(下)

    0x00 前言 接上篇丹丹妹 我又给大家带来了下篇 还是以python为开发语言 如有错误的地方还望大家多指正 轻喷 然后呢这边亲亲建议大家代码这种东西还是要多敲 多踩坑 毕竟伟大的爱情家周树人老先生说过只有痛过才能在心底留下不可磨灭的记号
  • 长草(Python)

    题目描述 小明有一块空地 他将这块空地划分为 n 行 m 列的小块 每行和每列的长度都为 1 小明选了其中的一些小块空地 种上了草 其他小块仍然保持是空地 这些草长得很快 每个月 草都会向外长出一些 如果一个小块种了草 则它将向自己的上 下
  • 【转】山寨一个 Boost.Bind

    原文地址 http www cppblog com Streamlet archive 2012 04 21 172241 html 点击打开链接 一直比较好奇 boost bind 里面占位符和参数的顺序是怎么实现的 也一直看不太懂这方面
  • 2023年最火副业:Python爬虫兼职,一周赚7800元,一天只要两小时 !

    下写了5 6年Python 期间写了各种奇葩爬虫 挣各种奇葩的钱 写这篇文章总结下几种爬虫挣钱的方式 1 最典型的就是找爬虫外包活儿 这是网络爬虫最通常的的挣钱方式 通过外包网站 熟人关系接一个个中小规模的爬虫项目 一般向甲方提供数据抓取
  • 开发者须知,App和小程序须备案,否则面临清退!

    备案并不陌生 前端开发的老铁肯定熟悉 若你的网站未备案情况下 在国内的服务器是无法访问的 所谓备案 通常指的就是ICP备案 需要把你经营的信息 给相关部门进行报备 简而言之 就是网络上的 营业执照 这么做的目的 就是维护网络的安全 防止在网
  • JDK源码阅读之AbstractStringBuilder类

    AbstractStringBuilder类源码阅读 AbstractStringBuilder类的作用 AbstractStringBuilder类的类图 AbstractStringBuilder类的重点方法 属性变量 构造方法 精华方
  • StringUtils常用方法+StringUtils详细介绍

    StringUtils用法 StringUtils详细介绍 博文来源 http yijianfengvip blog 163 com blog static 175273432201212221935832 public static vo
  • anaconda64位环境切换为32位,切换64位和32位python的方法

    今天需要调用一个dll动态函数库 但是本地的python是64位的 dll是32位的 直接调用会报错 OSError WinError 193 1 不是有效的 Win32 应用程序 1 python版本 3 6 anaconda对于pyth
  • Python学习(三)条件运算

    Python学习 三 条件运算 之前讲解了Python中的一些基本语法 今天我们来讲一下Python中的条件运算 一 条件运算符 在Python中我们可以用条件运算符进行最基本的条件判断 基本语法为 语句1 if 条件判断式 else 语句
  • git上传项目到Github(详细版)

    第一步 下载git 官网 Git Downloads 第二步 再需要上传到github的项目右键 打开git的命令行界面 第三步 查看当前分支 所在的分支就是代码上传的地方 git branch 如果需要切换分支 则执行以下语句 切换到主分
  • 浅析java基本数据类型

    java中的基本数据类型4类8种 四种整数类型 byte short int long 两种浮点数类型 float double 一种字符类型 char 一种布尔类型 boolean true 真 和 false 假 所谓数据类型 在数据结
  • 若依免登录进首页

    现象 在启动若依后 输入验证码登录至首页 然后关掉idea中的前后端 再打开idea重启前后端 然后发现若依免登录直接进入到首页 应是login vue中设置了Cookie 如下图所示 这里验证码的答案因为已经缓存到Redis中了 因而在该
  • mpu6050数据,mqtt订阅实时存mysql数据库

    import json import paho mqtt client as mqtt import pymysql import time HOST mqtt域名 PORT mqtt端口号 KEEPALIVE 60 topic MPU60
  • linux系统架构与目录解析

    1 当有两个硬盘都装有linux时 居然可以直接跳进另一个操作系统 不用重启 使用命令chroot 做一些简单的操作 因为linux kernel差不多 2 linux本地启动过程为grub gt kernel gt initrd gt i
  • RIP的防环机制:水平分割、毒性反转、触发更新

    RIP的防环机制 水平分割 毒性反转 触发更新 RIP Routing Information Protocol 路由信息协议 一种距离矢量路由协议 属于IGP协议 适用于中小型网络 使用UDP进行路由信息的交互 端口号520 为了防止产生
  • 计网学习记录,burp抓包等学习记录

    攻防实验室 网安学习记录 1 学习到html的基础架构及其简单用法 1 html基础架构 2 table 定义表格 2 学会用phpstudy创建网站 3 用wordpress对phpstudy创建的网站进行了编辑修改 4 仅通过phpst
  • Android日志分析02-am篇

    Android日志分析02 am篇 在日常分析bug时 免不了和系统ActivityManagerService打交道 根据日志去查看各个Activity的生命周期 从而判断是否出现Activity生命周期异常 先使用adb logcat和
  • for in / for of / forEach 循环

    目录 1 for 循环 2 for in 循环 3 forEach 循环 4 for of循环 5 const 在 for in 或者for of 中的使用 1 for 循环 for 循环的最大缺点是需要跟踪计数器和退出条件 虽然 for
  • nginx解决端口问题含配置步骤---反向代理

    centos7下安装nginx博客链接 https blog csdn net qq 41357211 article details 99694744 nginx配置反向代理步骤 在文章下面 nginx安装在服务器后 例如服务器的域名为
  • android接口加密实现方案

    Fiddler抓包工具配置 android接口如何防抓取 Windows下使用OpenSSL生成RSA证书 文中使用的加密库 1 程序主类 import android os Bundle import android support v7