最近在接口調(diào)試,公司后臺選用的是 RSA 非對稱加密,需要使用后臺提供的公鑰對請求中的參數(shù)進行加密,中間踩了很多很多坑,最后問題解決后回來看,發(fā)現(xiàn)真的,路走的太彎了,費勁。
- base64
android 自帶Base64的類的參數(shù)及其含義(flags)
1.CRLF:這個參數(shù)看起來比較眼熟,它就是Win風(fēng)格的換行符,意思就是使用CR LF這一對作為一行的結(jié)尾而不是Unix風(fēng)格的LF
2.DEFAULT:這個參數(shù)是默認(rèn),使用默認(rèn)的方法來加密
3.NO_PADDING:這個參數(shù)是略去加密字符串最后的“=”
4.NO_WRAP:這個參數(shù)意思是略去所有的換行符(設(shè)置后CRLF就沒用了)
5.URLSAFE:這個參數(shù)意思是加密時不使用對URL和文件名有特殊意義的字符來作為加密字符,具體就是以-和取代+和/
使用DEFAULT參數(shù)時,字符串長度過長會自動換行,一般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 或更高版本上,調(diào)用 Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") 或者Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC")) 會報錯 NoSuchAlgorithmException,
原因是 Google 將棄用 AndroidOpenSSL(也稱為Conscrypt)提供程序復(fù)制的 BC 提供程序中的某些功能.
2.刪除加密提供程序。也就是從 P 開始,Crypto 提供程序就不要使用了,使用就要報錯 NoSuchAlgorithmException.
根據(jù) 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");
}