谷歌博客(爬墙楼梯自备)
前言
Android 9.0 AES加密适配的大坑,我帮大家踩过了,希望对大家有帮助
报错日志
错误日志如下
- java.security.NoSuchAlgorithmException: class configured for SecureRandom (provider: Crypto) cannot be found.
- 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需要适配............并没有提供解决方案。
问题修复
谷歌博客中找到了如下文件
用谷歌的提供的类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);
源码如下
由于源码太长,相应资源获取方式,请关注公众号并且在后台回复:加密适配
源码所在位置
请关注我(分享日常开发)
参考文档
https://www.jianshu.com/p/b854e97fb856
https://7449.github.io/2018/12/11/android-p-aes/
网友评论