浅谈android数据存储加密

写在开头

CSDN:http://blog.csdn.net/say_from_wenjava

掘金:https://juejin.im/user/59b09eb2518825241e2255eaandroid

在移动端的开发中,数据安全的问题一直是你们备受关注的,数据加密技术也受到了你们的青睐。项目中也用到了一些,在这里学习总结下,完善下本身的知识,也分享给你们,一块儿交流!(末尾也会说下本身在项目中的使用)算法

按可逆性:加密可分为可逆算法不可逆算法数组

按对称性:加密可分为对称算法非对称算法安全

通常的加密分为如下几种,下面会分别简单讲解原理和其使用方法:服务器

Base64编码算法 (可逆)-MD5加密  (不可逆)(还有一个sha1值,可能作过支付宝的会比较熟悉)网络

-Des加密  (对称,可逆)-Aes加密  (对称,可逆)分布式

-Rsa加密(非对称,可逆)学习

浅谈对称非对称

对称

对称加密算法是较传统的加密体制,即通讯双方在加/解密过程当中使用他们共享的单一密钥,鉴于其算法简单加密速度快的优势,目前仍然在使用,可是安全性方面就差一点可能。最经常使用的对称密码算法是DES算法,而DES密钥长度较短,已经不适合当今分布式开放网络对数据加密安全性的要求。一种新的基于Rijndael算法(本身脑补,本人也不太熟悉)对称高级数据加密标准AES取代了数据加密标准DES,弥补了DES的缺陷,目前使用比较多一点。网站

非对称

非对称加密因为加/解密钥不一样(公钥加密,私钥解密),密钥管理简单,获得了很普遍的应用。RSA是非对称加密系统最著名的公钥密码算法。可是因为RSA算法进行的都是大数计算,使得RSA最快的状况也比AES慢上倍,这是RSA最大的缺陷。可是其安全性较高,这也是你们比较喜欢的地方吧!

算法讲解及使用

Base64算法

Base64其实并非安全领域的加密算法,由于它的加密解密算法都是公开的,典型的防菜鸟不防程序猿的例子哈哈,Base64编码本质上是一种将二进制数据转成文本数据的方案。用处就是将一些不适合传输的数据内容进行编码来适合传输

字符串进行Base64编码

String encodedString = Base64.encodeToString("wenwen".getBytes(), Base64.DEFAULT);

第一个参数就是字节数组

字符串进行Base64解码

String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT));

decodedString 就是wenwen

MD5算法

它是一种单向加密算法,只能加密、没法解密。多用于密码的存储等等。对于MD5的安全性,网上有关MD5解密的网站数不胜数,破解机制采用穷举法,就是手机全部可能的MD5值跑字典。因此经常采用对数据进行屡次MD5加密或者采起加盐(就是加一段独有的字符串在进行加密)的操做。

使用:

 

对称加密(这里只说下应用普遍的AES)

对称加密秘钥是惟一的,加密解密都是一个秘钥。AES速度上占优于RSA,可是只有一个秘钥,安全性较低一些。

使用:

 

 

 

RSA加密

RSA算法是最流行的公钥密码算法,使用长度能够变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。它在不少密码协议中都有应用,如SSL和S/MIME。RSA算法是基于大质数的因数分解的公匙体系。简单的讲,就是两个很大的质数,一个做为公钥,另外一个做为私钥,如用其中一个加密,则用另外一个解密。密钥长度从40到2048位可变,密钥越长,加密效果越好,但加密解密的开销也大。因此他在加密的速度上回小于AES等对称加密。

使用:

 

 

 

RSA所遇问题

关于加密填充方式:以前觉得上面这些操做就能实现rsa加解密,觉得万事大吉了,呵呵,这事还没完,悲剧仍是发生了,Android这边加密过的数据,服务器端死活解密不了,原来android系统的RSA实现是"RSA/None/NoPadding",而标准JDK实现是"RSA/None/PKCS1Padding" ,这形成了在android机上加密后没法在服务器上解密的缘由,因此在实现的时候这个必定要注意。

实现分段加密:搞定了填充方式以后又自信的认为万事大吉了,但是意外仍是发生了,RSA非对称加密内容长度有限制,1024位key的最多只能加密127位数据,不然就会报错(javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes) , RSA 是经常使用的非对称加密算法。最近使用时却出现了“不正确的长度”的异常,研究发现是因为待加密的数据超长所致。RSA 算法规定:待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:KeySize / 8 - 11),而加密后获得密文的字节数,正好是密钥的长度值除以 8(即:KeySize / 8)。

分段公钥加密私钥加密

 

 

 

请接着下图看!!

分段私钥加密公钥加密

 

仍是要请你接着下图看一下

项目中使用

在实际开发中,不是过重要的数据用一种加密方式感受就能够了。可是比较重要的数据建议用多种加密方式结合的方式,好比我用的RSA+AES加密。

他主要解决了两个问题:

1.RSA加解密速度慢,不适合大量数据文件加密 

2.AES加密速度很快,可是安全性没有RSA加密方式的安全。

其主要思想就是服务端生成公钥私钥,并提供接口将公钥给android端,android端生成AES秘钥,并用AES秘钥对大量数据进行加密(解决RSA加解密速度慢的问题),而后用调用接口拿到的RSA公钥对本身生成AES秘钥进行加密,客户端将获得的秘钥和经过AES加密的数据发送给服务器。(秘钥能够放在请求头中,数据放在请求体中,这个随意了)。服务拿到你的秘钥和数据后,用私钥加密获得AES秘钥,再经过秘钥获得发送的数据就行了。

感谢教我学习的大神

此次的学习也是学习的其余大神的总结,很是感谢他们,在这里记录下来,供本身学习也想让更多的人看到,帮助更多的人。http://blog.csdn.net/randyjiawenjie/article/details/6587986http://blog.csdn.net/axi295309066/article/details/52491077http://blog.csdn.net/qq_26685493/gongyongfeng的博客http://www.cnblogs.com/whoislcj/李总写代码

做者:say_from_wen 连接:https://www.jianshu.com/p/4f4a927339a9 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

相关文章
相关标签/搜索