如何提高加密业务的性能

对加密不懂的可以点这里:也许,这样理解HTTPS更容易
后面会附上RSA加密解密方法代码。


常用的加密一般有:
对称加密:AES、DES等
非对称加密:RSA
首先说一下业务需求,要把Crash信息进行本地保存,并且上报到后台服务端
这里贴出的是RSA加密解密的方法。如果对加密、解密的过程没有太高要求的话,RSA基本就够用了,用公钥加密,在服务端用私钥解密就行。
那么如果我们想进一步提高性能怎么办?我们知道,非对称加密虽然更安全,但是带来了相应的性能消耗,所以我们能不能找到一种,非对称和对称加密相结合的方法呢?
这里说一个方案:

  1. 使用随机数对应char,生成字符串string
  2. 对string进行非对称加密,生成RSAKEY
  3. 对数据message用对称加密(加密的KEY就是string),生成MSG
  4. 同时把RSAKEY和MSG写入文件,上传到服务器。

按照上面的步骤,我们只需要把string进行非对称加密就好了,这样的性能消耗是可以接受的。
同时安全性上:message是使用对称加密的,对称加密的密钥是你用非对称加密加密后写入本地的,这个是只有你自己用私钥能解开的,所以秘密性上也是安全的。


下面附上RSA加密解密和公钥私钥生成的代码:


public class RSAsecurity {

    public static String src = "RSA 加密字符串";

    public void priENpubDE() {

        try {
            // 1.初始化秘钥
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            // 秘钥长度 RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024
            keyPairGenerator.initialize(512);
            // 初始化秘钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            // 公钥
            RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
            // 私钥
            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

            // 2.私钥加密,公钥解密----加密
            // 生成私钥
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            // Cipher类为加密和解密提供密码功能,通过getinstance实例化对象
            Cipher cipher = Cipher.getInstance("RSA");
            // 初始化加密
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("私钥加密,公钥解密----加密:" + Base64.getEncoder().encodeToString(result));

            // 3.私钥加密,公钥解密----解密
            // 生成公钥
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
            keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
            cipher = Cipher.getInstance("RSA");
            // 初始化解密
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            result = cipher.doFinal(result);
            System.out.println("私钥加密,公钥解密----解密:" + new String(result));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void pubENpriDE() {

        try {
            // 1.初始化秘钥
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            // 秘钥长度
            keyPairGenerator.initialize(512);
            // 初始化秘钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            // 公钥
            RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
            // 私钥
            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

            // 2.公钥加密,私钥解密----加密
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
            // 初始化加密
            // Cipher类为加密和解密提供密码功能,通过getinstance实例化对象
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            // 加密字符串
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("公钥加密,私钥解密----加密:" + Base64.getEncoder().encode(result).toString());

            // 3.公钥加密,私钥解密-----解密
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
            keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            // 初始化解密
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            // 解密字符串
            result = cipher.doFinal(result);
            System.out.println("公钥加密,私钥解密-----解密:" + new String(result));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值