Android 9.0 加密适配

作者: 奔跑吧技术人 | 来源:发表于2019-01-08 23:01 被阅读130次

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

前言

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);

源码如下

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

源码所在位置

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

参考文档
https://www.jianshu.com/p/b854e97fb856
https://7449.github.io/2018/12/11/android-p-aes/

相关文章

网友评论

    本文标题:Android 9.0 加密适配

    本文链接:https://www.haomeiwen.com/subject/jhqvrqtx.html