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