对加密不懂的可以点这里:也许,这样理解HTTPS更容易
后面会附上RSA加密解密方法代码。
常用的加密一般有:
对称加密:AES、DES等
非对称加密:RSA
首先说一下业务需求,要把Crash信息进行本地保存,并且上报到后台服务端
这里贴出的是RSA加密解密的方法。如果对加密、解密的过程没有太高要求的话,RSA基本就够用了,用公钥加密,在服务端用私钥解密就行。
那么如果我们想进一步提高性能怎么办?我们知道,非对称加密虽然更安全,但是带来了相应的性能消耗,所以我们能不能找到一种,非对称和对称加密相结合的方法呢?
这里说一个方案:
- 使用随机数对应char,生成字符串string
- 对string进行非对称加密,生成RSAKEY
- 对数据message用对称加密(加密的KEY就是string),生成MSG
- 同时把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();
}
}
}