Android9.0加密適配

NO IMAGE

谷歌博客(爬牆樓梯自備)

前言

Android 9.0 AES加密適配的大坑,我幫大家踩過了,希望對大家有幫助

報錯日誌

Android9.0加密適配

Android9.0加密適配

錯誤日誌如下

  1. java.security.NoSuchAlgorithmException: class configured for SecureRandom (provider: Crypto) cannot be found.
  2. 01-08 07:36:44.140 24115-24115/com.boy.learning W/System.err: java.security.NoSuchProviderException: no such provider: Crypto

錯誤代碼定位

 /**
* 對密鑰進行處理
*/
public static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance(AES);
secureRandom = SecureRandom.getInstance("SHA1PRNG", new CryptoProvider());
sr.setSeed(seed);
kgen.init(128, sr); //256 bits or 128 bits,192bits
//AES中128位密鑰版本有10個加密循環,192比特密鑰版本有12個加密循環,256比特密鑰版本則有14個加密循環。
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}

SecureRandom.getInstance(“SHA1PRNG”, new CryptoProvider());這種調用方式導致了異常,AES加密失效。

谷歌博客中原話:在Android N中,我們完全棄用了SHA1PRNG算法和Crypto提供程序的實現,並且很含蓄的給出瞭解決方案,然而國內很多博客,就是說明Android P需要適配…………並沒有提供解決方案。

問題修復

谷歌博客中找到了如下文件

Android9.0加密適配

用谷歌的提供的類InsecureSHA1PRNGKeyDerivator去派生出密鑰,將獲取SecretKey的方法全部替換成如下就ok了

  byte[] rawKey=rawKey = InsecureSHA1PRNGKeyDerivator.deriveInsecureKey(password.getBytes(), 32);

效果展示

        String encryStr = AesUtils.encrypt("12345678", "走向全棧工程師");
Log.d(TAG, "走向全棧工程師加密:" + encryStr);
String decryStr = AesUtils.decrypt("12345678", encryStr);
Log.d(TAG, encryStr + "解密:" + decryStr);

Android9.0加密適配

源碼如下

由於源碼太長,相應資源獲取方式,請關注公眾號並且在後臺回覆:加密適配

源碼所在位置

Android9.0加密適配

請關注我(分享日常開發)

Android9.0加密適配

參考文檔

www.jianshu.com/p/b854e97fb…

7449.github.io/2018/12/11/…

相關文章

Python爬蟲之旅之Selenium庫的使用

Kotlin重構初體驗之告別FindViewById

Kotlin重構如何兼容原先的ButterKnife、EventBus3.1

Kotlin環境搭建