Android网络请求加密机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android网络请求加密机制相关的知识,希望对你有一定的参考价值。

参考技术A 密码学的三大作用:加密( Encryption)、认证(Authentication),鉴定(Identification)

加密 :防止坏人获取你的数据。 

鉴权 :防止坏人假冒你的身份。

认证 :防止坏人修改了你的数据而你却并没有发现。

1. URLEncode和URLDecoder 作用:URLEncode就是将URL中特殊部分进行编码。URLDecoder就是对特殊部分进行解码。

为什么URL要encode原因呢?

url转义其实也只是为了符合url的规范而已。因为在标准的url规范中 中文和很多的字符 是不允许出现在url中的。

2. Base64编码

为什么要进行Base64编码?

在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

应用场景:主要是对于二进制数据进行编码,(文件、图片、加密后的二进制数据)

3. 消息认证算法

要确保加密的消息不是别人伪造的,需要提供一个消息认证码(MAC,Message authentication code) 。 

消息认证码是带密钥的hash函数,基于密钥和hash函数(单向散列函数)。

密钥双方事先约定,不能让第三方知道。

消息发送者使用MAC算法计算出消息的MAC值,追加到消息后面一起发送给接收者。 

接收者收到消息后,用相同的MAC算法计算接收到消息MAC值,并与接收到的MAC值对比是否一样。

消息认证码的作用:检查某段消息的完整性,以及作身份验证。

防止重放 攻击可以有 3 种方法:

序号

每条消息都增加一个递增的序号,并且在计算 MAC 值的时候把序号也包含在消息中。这样攻击者如果不破解消息认证码就无法计算出正确的 MAC 值。这个方法的弊端是每条消息都需要多记录最后一个消息的序号。

时间戳

发送消息的时候包含当前时间,如果收到的时间与当前的不符,即便 MAC 值正确也认为是错误消息直接丢弃。这样也可以防御重放攻击。这个方法的弊端是,发送方和接收方的时钟必须一致,考虑到消息的延迟,所以需要在时间上留下一定的缓冲余地。这个缓冲之间还是会造成重放攻击的可趁之机。

nonce

在通信之前,接收者先向发送者发送一个一次性的随机数 nonce。发送者在消息中包含这个 nonce 并计算 MAC 值。由于每次 nonce 都会变化,因此无法进行重放攻击。这个方法的缺点会导致通信的数据量增加。

4. 对称加密算法

特点:加解密只有一个密钥。优点:速度快、效率高。缺点:密钥交换问题。算法:AES(256字节,主流)、DES(8字节,淘汰)。

密钥交换问题如何解决,MAC同样也有这个问题,可以使用非对称加密传输,或者私下约定,密钥管理中心。

5. 非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密(这个过程可以做数字签名) 。 非对称加密主要使用的是RSA算法。

特点:公/私钥机制。优点:只需要交换公钥,安全。缺点:加解密速度慢,特别是解密。算法:RSA。应用:数字签名。

数字签名 :

简单解释:

A:将明文进行摘要运算后得到摘要(消息完整性),再将摘要用A的私钥加密(身份认证),得到数字签名,将密文和数字签名一块发给B。

B:收到A的消息后,先将密文用自己的私钥解密,得到明文。将数字签名用A的公钥进行解密后,得到正确的摘要(解密成功说明A的身份被认证了)。

数字证书 :

6. android端 AES+RSA结合实践

基本流程

Android端

服务器端

基本上如下图所示的流程:

完美解决Android 9.0以上HTTP网络请求被限制问题

参考技术A Android P 9.0以上系统,HTTP网络被限制。HTTPS无影响。
Android 10系统同样的问题。
Android P以上要求网络请求必须为Https,Http请求会抛异常。

  Android P以上的应用默认都被限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。同时,目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。

需要在AndroidManifest.xml文件中设置:

  android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。

忽略证书,可以使用明文流量访问,https&http都可以访问。

  避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。

别忘记在Android.Manifest.xml文件中添加网络访问权限哦!

以上是关于Android网络请求加密机制的主要内容,如果未能解决你的问题,请参考以下文章

Android Okhttp/Retrofit网络请求加解密实现方案

Android 9.0/P http 网络请求的问题

Android 关于 OkHttp 请求对参数进行加解密的封装

Android超时机制的处理(很不错)

我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密

Android——消息分发机制