我知道有款软件,MISUO,这款软件是可以针对所有的安卓系统知段进行数据加密的、
但是你描述的问题不是很清楚,所以不知穗配道需要达到的具体效果是什么样的,不过建议猜猛指你可以下载试用一下
B. Android之网络—第二篇(Https原理)
Android之网络—第一篇(Http原理)
Android之网络—第二篇(Https原理)
Android之网络—第三篇(解读OkHttp)
Android之网络—第四篇(解读Retrofit)
说的通俗一点就是身披安全衣的Http,本质还是http,只是在http外层嵌套了一个SSL/TLS的安全层,该层做了一些数据的加解密处理。
在讲解Https原理之前,先做点准备工作,因为会涉及到SSL/TLS连接建立、SSL/TLS加解密方面的知识。所以会整体从网络架构和比较重要的知识点回顾下网络知识。
在讲解什么是SSL/TLS之前,回顾下TCP/IP协议的分层概念。通常一个网络的传输中间会经过很多的传输节点,才最终达到服务器。期间过程会包含数据的拆分和拼装、IP的解析、数据的传输等等操作,但是网络传输是很不稳定的,如果这次网络请求在中间的某一节点失败了,难道还要重新再发送一遍么?答案是不应该这么做。
为了网络传输的统一规范,就设计了这么一套网络通信的规范,每一层都专注做一件事情,即使当前失败了,也在这层做处理就可以了,尽量避免重发。
简单解释下,每层的含义:
通过上图发现,数据是由上往下传递后,再由下往回传递。这是怎么回事呢?总结就是:在 TCP / IP协议中数据先由上往下将数据装包,然后由下往上拆包。在装包的时候,每一层都会增加一些信息用于传输,这部分信息就叫报头,当上层的数据到达本层的时候,会将数据加上本层的报头打包在一起,继续往下传递。在拆包的时候,每一层将本层需要的报头读取后,就将剩下的数据往上传。
简要分析下传输过程:
这里简单总结下传输层的两种连接方式:TCP和UDP
三次握手:客户端主动打开连接,服务器被动打开连接。
四次挥手:客户端主动关闭,服务器被动关闭
说个概念性的东西就是,现代密码学分为对称加密和非对称加密,跟传统密码学不一样的地方就是,除了可以加密文字内容外,还可以用于各种二进制数据的加解密。
通信双方使用同一个密钥,使用加密算法配合上密钥来加密,解密时使用解密算法(加密过程的完全逆运算)配合密钥来进行解密。常用的经典算法:DES(56 位密钥,密钥太短而逐渐被弃用)、AES(128 位、192 位、256 位密钥,现在最流行)。
通信双方使用公钥和加密算法对数据进行加密得到密文;使用私钥和加密算法对数据进行解密得到原数据。常用的经典算法:RSA(可用于加密和签名)、DSA(仅用于签名,但速度更快)。
这个有什么用?其实这个就是后面Https加解密的原理。原理这么简单么?是的,就这么简单。但是要理解还得慢慢往下看。
A用自己的私钥通过加密算法得到的数据密文数据,这个数据就可以称为签过名。接收方B再用A提供的公钥通过加密算法就可以还原数据,从而就验证了数据的真实性。因为只有A一个人拥有自己的私钥。
到这里咱们就可以聊聊刚才中间人伪造数据是如何处理了。通过对称加密可以防止中间人偷窥数据,通过数字签名可以防止中间人篡改伪造数据。
但是完整版的签名信息需要将签名数据取Hash值,减少数据大小
好了,看完理解了上面的知识点,到这里我们可以慢慢分析Https是如何工作的了。
先来总结一句话:Https的本质就是在客户端和服务端之间用非对称加密协商出一套对称密钥,每次发送信息之前将内容加密,接收后解密,达到内容的加密传输。解释下,就是整个数据的传输过程是用对称加密的方式来传输的,只是密钥的生成是由客户端和服务端 在创建连接的时候 通过 非对称加密的方式 协商生成的。
那这里就会有一系列的问题啦:
Q:为什么不直接用非对称加密的方式直接加密呢?
A:因为非对称加密的计算过程是复杂的数学运算,太复杂了,很慢。
Q:哦哦,那既然使用对称加密的话,这个对称密钥是怎么来的?
A:在实际的场景中,服务端会对接N个客户端,这个对称密钥如果都使用同一个密钥来通信的话,肯定是不合理的,只要破解了其中一个,其他所有的都会被破解。所以整体的网络架构应该是使用不同加密方式用不同的密钥来进行数据传输的。模型如下图
Q:但是在网络场景中,对称加密的密钥是不能直接在网络上传输的。服务端和客户端是如何都知道的呢?
A:这个是服务端和客户端一起协商根据只有它俩知道的规则分别生成,就不用通过网络传输啦。
Q:如果保证它俩协商出来的密钥不被破解呢?
A:当然是使用非对称加密的方式啦。通过之前的加密知识,可以知道非对称加密是目前来说是绝对安全的。而且一个私钥可以有多个公钥,正好满足一个服务端对N个客户端的场景。模型如下图:
实际在协商通讯的过程中,这个公钥是服务端给客户端发送的。而且需要注意 这个公钥是用来协商生成对称密钥的,不是用来做数据的加密传输的 。
Q:哦哦,原来是这样,但是这样子还是有问题啊,客户端与服务端在协商生成密钥的过程中为了保证数据被偷窥和被篡改的风险,一般会要求有两套公钥和私钥分别做加解密和签名验证处理的,上面的模型只有一套公钥和私钥,没法规避数据被被篡改的风险呀。
A:能提出这个问题,说明之前的学习理解得很好。从上面的模型,可以保证在协商的过程中客户端A/B/C/D分别向服务器传输的数据是安全。但是服务器发送给客户端的数据是如何保证的呢?换句话说就是,客户端如何验证数据是服务端发送过来的,而不是被中间假冒掉包的数据。这不就是之前讲的数字签名的内容么?而实际情况中,就是通过CA证书来处理这个问题的。
Q:那这个CA证书是怎么验证的呢?
A:请看下面的CA证书的分析。
回归之前的分析,我们的问题点卡在了“服务器发送给客户端的数据是如何保证的呢”。对吧。实际上在协商通信的过程中,服务端会先给客户端下发证书信息,这个证书信息里面会包含非对称加密的公钥。但是考虑一个问题,如何保证这个公钥就是客户端要的公钥呢?或者说怎么保证这个证书就是真实的证书,而不是被篡改假冒的证书。只有验证了这一步,客户端才完全信赖服务端,才给服务器发消息,也才接受服务器的消息。这时候就只需要一套公钥和私钥客户端和服务端就可以通信了。
Q:那客户端如何验证服务端下发的证书和公钥是正确的呢?
A:先换个概念,将证书里面的公钥假设为一串数据。要验证这个数据,只需要提供这串数据的签名以及加密这段数据的签名的私钥对应的公钥就可以了,如下图框框所示。
Q:那这样子又有另外的一个问题产生了怎么去验证 这段数据的签名的私钥对应的公钥 了?
A:同样的,也是需要提供对应的签名和对应签名的私钥对应的公钥。
Q:但是这样子下去就会变成一个循环了,怎么办?
其实在这里还会有一个场景问题:第三方签发机构不可能只给你一家公司制作证书,它也可能会给中间人这样有坏心思的公司发放证书。这样的,中间人就有机会对你的证书进行调包,客户端在这种情况下是无法分辨出是接收的是你的证书,还是中间人的。因为不论中间人,还是你的证书,都能使用第三方签发机构的公钥进行解密。
A:是的,为处理这个问题,就需要讲一个根证书的东西。先举个例子:假设你是HR,你手上拿到候选人的学历证书,证书上写了持证人,颁发机构,颁发时间等等,同时证书上,还写有一个最重要的:证书编号!我们怎么鉴别这张证书是的真伪呢?只要拿着这个证书编号上相关机构去查,如果证书上的持证人与现实的这个候选人一致,同时证书编号也能对应上,那么就说明这个证书是真实的。同样的,Https请求验证时,会用到手机操作系统内置的根证书去验证这个证书的真伪的。
到这里就简要分析完了证书的验证过程。证书会包含很多信息,包括服务器公钥,服务器名字,服务器地区等等信息。这个是没法篡改的。其中对Https连接来说最重要的就是服务器的公钥。
之前学习完TCP的连接过程,现在我们开始来唠唠Https连接。什么是Https连接呢?准确来说就是SSL/TLS加解密层的连接。
大致的建立流程:
详细的建立流程:
客户端MAC secret,服务端MAC secret的主要作用:用来认证这个消息是正确的,完整的,解决对称加密方式没法验证消息的缺点。
至此完整的Https在TLS层连接过程分析完毕。
如果觉得我的文章对你有帮助,请随意赞赏。您的支持将鼓励我继续创作!
C. 每日一问(二十)Android网络数据的加密方式
对称加密行扮:加密和解密数据都是使用同一个key,这方面的算法有DES。
非对称加密:加密和解密是使用不同的key。发氏带毕送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典歼芹型的非对称加密。
D. Android 的几种加密方式
Android 中的最常用得到有三种加密方式:MD5,AES,RSA.
1.MD5
MD5本质是一种散列函数,用以提供消息的完整性保护。
特点:
1.压缩性:任意长度的数据,算出的MD5值长度都是固定的;
2.容易计算:从原数据计算出MD5值很容易;
3.抗修改性:对原数据进行任何改动,哪怕只修改一个字节,所得到的MD5值都有很大的区别
4.强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(及伪造数据)是非常困难的;
2.RSA加密
RSA加密算法是一种非对称加密算法,非对称加密算法需要两个密钥:公共密钥和私有密钥。公钥和私钥是配对的,用公钥加密的数据只有配对的私钥才能解密。
RSA对加密数据的长度有限制,一般为密钥的长度值-11,要加密较长的数据,可以采用数据截取的方法,分段加密。
3.AES加密
AES加密是一种高级加密的标准,是一种区块加密标准。它是一个对称密码,就是说加密和解密用相同的密钥。WPA/WPA2经常用的加密方式就是AES加密算法。
E. 安卓网络请求数据时如何保证数据的完整性和安全性使用哪种加密
通过网络传输数据,需要保证数据的完整性、保密性,以及能够对数据的发送者进行身份验证。这些都需要通过一些加密算法实现。
对称加密:
加密和解密使用同一个密钥,特点:保证了数据的保密性。局限性:无法解决密钥交换问题。常用的算法有:DES,3DES,AES;
公钥加密:
生成一个密钥对(私钥和公钥),加密时用私钥加密,解密时用公钥解密,特点:解决了密钥交换问题。局限性:对大的数据加密速度慢。
单向加密:
提取数据的特征码,特点:定长输出,不可逆,可检验数据的完整性。局限性:无法保证数据的保密性。常用算法:MD5、SHA1、CRC-32。
三种加密方法各有优缺点,在时实际应用中,数据从发送方到达接收方,通常是这样应用的:
1) 首先对要发送的数据做单向加密,获取数据的特征码;
2) 对特征码用发送方的私钥进行加密生成S1;
3) 然后对S1和数据进行对称加密生成S2;
4) 最后将S2和对称加密的密码使用接收方的公钥进行加密。
这样一来数据在传输过程中的完整性、保密性以及对发送方身份的验证都能得到保障。
当数据到达接收方时,接收方先用自己的私钥对接收到的数据进行解密,得到密码和加密的数据;使用密码对加密数据解密,得到加密的特征码和数据;用发送方的公钥解密特征码,如果能解密,则说明该数据是由发送方所发;反之则不是,这便实现了身份验证;最后计算数据的特征码和解密出来的特征码做对比,如果一样,则该数据没有被修改;反之则数据被修改过了。
F. android 接口数据如何加密
方法步骤如下:
1.选择要发布的项目,右键如下:
7.点击Finish完成发布,在相应的位置生成两个文件为:
XX.apk和步骤4所起的文件名。
G. Android Okhttp/Retrofit网络请求加解密实现方案
比较安全的方案应该是AES+RSA的加密方式。具体如下图所示。
为什么要这样做呢?
1、RSA是非对称加密,公钥和私钥分开,且公钥可以公开,很适合网络数据传输场景。但RSA加密比较慢,据说比AES慢100倍,且对加密的数据长度也有限制。
2、AES是对称加密,加密速度快,安全性高,但密钥的保存是个问题,在网络数据传输的场景就很容易由于密钥泄露造成安全隐患
3、所以,AES+RSA结合才更好,AES加密数据,且密钥随机生成,RSA用对方(服务器)的公钥加密随机生成的AES密钥。传输时要把密文,加密的AES密钥和自己的公钥传给对方(服务器)。对方(服务器)接到数据后,用自己的私钥解密AES密钥,再拿AES密钥解密数据得到明文。这样就综合了两种加密体系的优点。
4、除上面说的外,还可以加签名,即对传输的数据(加密前)先做个哈希,然后用自己的RSA私钥对哈希签名(对方拿到自己的公钥可以验签),这样可以验证传输内容有没有被修改过。
就java来说,加密的输入和输出都是字节数组类型的,也就是二进制数据,网络传输或本地保存都需要重新编码为字符串。推荐使用Base64。Android 有自带的Base64实现,flag要选Base64.NO_WRAP,不然末尾会有换行影响服务端解码。
Android中Base64加密
总而言之,这些不同语言都有实现库,调用即可,关键是参数要一致,具体还需要和后台联调一下。
rsa加解密的内容超长的问题解决
现在说到网络框架,应该毫无疑问是Retrofit了。上面说的加密方案说到底还是要在网络请求框架内加上,怎么做入侵最小,怎么做最方便才是重点。
1、坑定不能直接在接口调用层做加密,加参数,这样每个接口都要修改,这是不可能的。
2、ConverterFactory处理,这也是网上可以搜到的很多文章的写法,但我觉得还是有入侵。而且有点麻烦。
3、OkHttp添加拦截器,这种方法入侵最小(可以说没有),实现呢也非常优雅。
下面的实现,网上也找不到多少可以参考的文章,但不得不说,OkHttp的封装和设计真的很好用,所见即所得。看下源码,就知道该怎么用了,连文档都不用查。
主要注意点:
0、和接口无关的新加的数据放在请求头里。
1、该close的要close,不然会内存泄漏。
2、新旧Request和Response要区分好,新的要替换旧的去传递或返回。
3、要对response.code()做处理,只有在和后台约定好的返回码下才走解密的逻辑,具体看自己的需求,不一定都是200。
H. Android网络请求加密机制
密码学的三大作用:加密( 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端
服务器端
基本上如下图所示的流程:
I. Android使用RSA加密和解密
1.data是要加密的数据,如果是字符串则getBytes。publicKey是公钥,privateKey是私钥。自定义密钥对测试
2.从文件中读取公钥
当加密的数据过长时,会出现javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes的异常。rsa算法规定一次加密的数据不能超过生成密钥对时的keyLength/8-11,keyLength一般是1024个字节,则加密的数据不能超过117个字节
测试分段加密和解密
生成公钥和私钥后,用base64编码
一、android加密的数据服务器上无法解密?
android的rsa加密方式是RSA/ECB/NoPadding,而标准jdk是RSA/ECB/PKCS1Padding,所以加密时要设置标准jdk的加密方式
二、base64编码。因为不同的设备对字符的处理方式不同,字符有可能处理出错,不利于传输。所以先把数据做base64编码,变成可见字符,减少出错
官方提供的base64类,Base64.encode编码,Base64.decode解码。用这个会有换行符,需要自定义
三、rsa是非对称加密算法。依赖于大数计算,加密速度比des慢,通常只用于加密少量数据或密钥
四、公钥加密比私钥加密块,公钥解密比私钥解密慢。加密后的数据大概是加密前的1.5倍
J. Android加密算法总结
1.概念:
Base64是一种用64个字符(+/)来表示二进制数据的方法,只是一种编码方式,所以不建议使用Base64来进行加密数据。
2.由来:
为什么会有Base64编码呢?因为计算机中数据是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。在网络上交换数据时,比如图片二进制流的每个字节不可能全部都是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送,把不可打印的字符也能用可打印字符来表示,所以就先把数据先做一个Base64编码,统统变成可见字符,降低错误率。
3.示例:
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
1.DES
DES全称为Data Encryption Standard,即数据加密标准,是一种使用 密钥加密 的块算法。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
2.3DES
3DES(或称为Triple DES)是三重 数据加密算法 (TDEA,Triple Data Encryption Algorithm)块密码的通称。是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。
3.AES
AES全称Advanced Encryption Standard,即高级加密标准,当今最流行的对称加密算法之一,是DES的替代者。支持三种长度的密钥:128位,192位,256位。
AES算法是把明文拆分成一个个独立的明文块,每一个明文块长128bit。这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。
但是这里涉及到一个问题:假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding):
AES的工作模式,体现在把明文块加密成密文块的处理过程中。
加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。
1.SHA
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法,且若输入的消息不同,它们对应到不同字符串的机率很高。
SHA分为SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512五种算法,后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。
2.RSA
RSA算法1978年出现,是第一个既能用于数据加密也能用于数字签名的算法,易于理解和操作。
RSA基于一个数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可提供给任何人使用,私钥则为自己所有,供解密之用。
3.MD5
MD5信息摘要算法 (英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。具有如下优点:
XOR:异或加密,既将某个字符或者数值 x 与一个数值 m 进行异或运算得到 y ,则再用 y 与 m 进行异或运算就可还原为 x。
使用场景:
(1)两个变量的互换(不借助第三个变量);
(2)数据的简单加密解密。