Android 9.0 加密适配

谷歌博客(爬墙楼梯自备)

前言

Android 9.0 AES加密适配的大坑,我帮大家踩过了,希望对大家有帮助

报错日志

错误日志如下

  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需要适配............并没有提供解决方案。

问题修复

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

用谷歌的提供的类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);
复制代码

源码如下

由于源码太长,相应资源获取方式,请关注公众号并且在后台回复:加密适配

源码所在位置

请关注我(分享日常开发)

参考文档

www.jianshu.com/p/b854e97fb…

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值