Android RSA加密验证遇到的坑

最近在接口调试,公司后台选用的是 RSA 非对称加密,需要使用后台提供的公钥对请求中的参数进行加密,中间踩了很多很多坑,最后问题解决后回来看,发现真的,路走的太弯了,费劲。

  1. base64

android 自带Base64的类的参数及其含义(flags)

1.CRLF:这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF

2.DEFAULT:这个参数是默认,使用默认的方法来加密

3.NO_PADDING:这个参数是略去加密字符串最后的“=”

4.NO_WRAP:这个参数意思是略去所有的换行符(设置后CRLF就没用了)

5.URLSAFE:这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和取代+和/

使用DEFAULT参数时,字符串长度过长会自动换行,一般android编解码都是使用NO_WRAP.

  1. 获取公钥

在使用 KeyFactory.getInstance("RSA", "BC") 获取 keyFactory 时会抛出 NoSuchAlgorithmException 异常.

在 error 中会有这么一段话:

The BC provider no longer provides an implementation for KeyFactory.RSA. Please see [https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html](https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html) for more details.

原因是 BC 提供者不再提供 KeyFactory.RSA 的接口....太坑了

https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html

1.Provider 被更改。在 Android P 或更高版本上,调用 Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") 或者Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC")) 会报错 NoSuchAlgorithmException,
原因是 Google 将弃用 AndroidOpenSSL(也称为Conscrypt)提供程序复制的 BC 提供程序中的某些功能.

2.删除加密提供程序。也就是从 P 开始,Crypto 提供程序就不要使用了,使用就要报错 NoSuchAlgorithmException.

根据 google 建议将代码修改如下:

KeyFactory keyFactory;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
      keyFactory = KeyFactory.getInstance("RSA");     //适配Android P及以后版本,否则报错NoSuchAlgorithmException
} else {
      keyFactory = KeyFactory.getInstance("RSA", "BC");
}

你可能感兴趣的:(Android RSA加密验证遇到的坑)