最近在接口调试,公司后台选用的是 RSA 非对称加密,需要使用后台提供的公钥对请求中的参数进行加密,中间踩了很多很多坑,最后问题解决后回来看,发现真的,路走的太弯了,费劲。
- 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.
- 获取公钥
在使用 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");
}
网友评论