android接口加密实现方案

 

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);
    }

}

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值