RSA加密在移动端与服务器通信中的应用

由于项目需要,客户端在与服务端通信时,一些关键信息不能通过明文传输,需要将其进行加密,以防他人通过抓包工具截获业务通信信息后,从中捣乱。

设计思路是使用RSA加密。服务端生成RSA的密钥对;将公钥发给客户端;客户端使用该公钥对关键信息进行加密后,再将关键信息发送给服务器;服务器收到关键信息后,使用私钥进行解密,然后通过甄别解密后的关键信息,从而判定是否是真实有效的客户端用户。

服务端的工作:

1.用OpenSSL::Pkey::RSA.new出RAS的密钥对:公钥、私钥;生成后的公钥形式如下:

"-----BEGIN PUBLIC KEY-----\n
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr4FshqahW+GI3kKAkzFm\n
yQbYTYZ3w5XUE8hoRY85QG5tXcFNhTaqEskXxQptrBqOHqzbSyoUl2EBBubv57wO\n
ElatAJm6SNSCL4NgcfaSDLQ/w61+HkARwimcAE7/BWJR8M151hYyiCZo8FyORyP2\n
vUWk7/z1SQRifZYj0RcwHo02rd8JFMyee72S6C8z8hvXqao2XCtvUH49M9tOoDzT\n
j2F98JKiUN4535wHFH9IXXqYVMzQlOkbArLFbUH0aZ4IzwPF7Cmh4Mv0SSlxXjha\n
RrwywG3017IF8UFru5ZltYTbbqHqlzbt734sc38JkmjvDfX01KLdch+uYUTDrUEf\n
6wIDAQAB\n
-----END PUBLIC KEY-----\n"

2.处理这个公钥字符串,这个工作也可以放到客户端进行。要注意的是,除了去除开始行和结束行外,中间部分的公钥字符串里其实是自动包含了不少换行符“\n”的,这些换行符也一定要去掉。

客户端的工作:

1.处理从服务端收到的公钥字符串(String):

1.1去除公钥字符串的开始行和结束行以及换行符:

            String regularExp = "(-+BEGIN PUBLIC KEY-+\\r?\\n|-+END PUBLIC KEY-+\\r?\\n?)";
            String realPublicKey = publicKey.replaceAll(regularExp, "").replaceAll("\\n", "");

1.2使用Base64对公钥字符串进行Decode;

1.3使用X509将公钥字符串类型转换成RSAPublicKey类:

            byte[] buffer = Base64Util.decode(publicKeyStr);

            KeyFactory keyFactory = KeyFactory.getInstance(RSA);

            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);

            (RSAPublicKey) keyFactory.generatePublic(keySpec);
其中的Base64Util是从网上找的,Java本身没有提供Base64的类;

2.使用公钥RSAPublicKey对关键信息进行RSA加密:

    public static byte[] encryptData(byte[] data, PublicKey publicKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            // 编码前设定编码方式及密钥
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            // 传入编码数据并返回编码结果
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
这一步中,Ciper实例的算法指定非常重要,android使用的不是标准的RSA,而是"RSA/ECB/PKCS1Padding"。

3.对加密后的关键信息进行Base64的Encode

4.将关键信息转成字符串发送给服务端。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值