美文网首页
Android RSA加密验证遇到的坑

Android RSA加密验证遇到的坑

作者: yuGodddddd | 来源:发表于2019-12-19 10:57 被阅读0次

    最近在接口调试,公司后台选用的是 RSA 非对称加密,需要使用后台提供的公钥对请求中的参数进行加密,中间踩了很多很多坑,最后问题解决后回来看,发现真的,路走的太弯了,费劲。

    1. base64

    android 自带Base64的类的参数及其含义(flags)

    1.CRLF:这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF
    
    2.DEFAULT:这个参数是默认,使用默认的方法来加密
    
    3.NO_PADDING:这个参数是略去加密字符串最后的“=”
    
    4.NO_WRAP:这个参数意思是略去所有的换行符(设置后CRLF就没用了)
    
    5.URLSAFE:这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和取代+和/
    
    

    使用DEFAULT参数时,字符串长度过长会自动换行,一般android编解码都是使用NO_WRAP.

    1. 获取公钥

    在使用 KeyFactory.getInstance("RSA", "BC") 获取 keyFactory 时会抛出 NoSuchAlgorithmException 异常.

    在 error 中会有这么一段话:

    The BC provider no longer provides an implementation for KeyFactory.RSA. Please see [https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html](https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html) for more details.
    

    原因是 BC 提供者不再提供 KeyFactory.RSA 的接口....太坑了

    https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html

    1.Provider 被更改。在 Android P 或更高版本上,调用 Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") 或者Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC")) 会报错 NoSuchAlgorithmException,
    原因是 Google 将弃用 AndroidOpenSSL(也称为Conscrypt)提供程序复制的 BC 提供程序中的某些功能.

    2.删除加密提供程序。也就是从 P 开始,Crypto 提供程序就不要使用了,使用就要报错 NoSuchAlgorithmException.

    根据 google 建议将代码修改如下:

    KeyFactory keyFactory;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
          keyFactory = KeyFactory.getInstance("RSA");     //适配Android P及以后版本,否则报错NoSuchAlgorithmException
    } else {
          keyFactory = KeyFactory.getInstance("RSA", "BC");
    }
    

    相关文章

      网友评论

          本文标题:Android RSA加密验证遇到的坑

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