Android开发之加密解密

加密算法

主要作用就是隐藏信息,让信息不可见,也用于提高网络访问的安全。

常见加密算法

  • BASE64 用于二进制内容转换为可编辑的文本内容
  • MD5 信息摘要算法
  • SHA 安全散列算法
  • HMAC 散列消息鉴别码
  • DES 数据加密算法
  • PBE 基于密码验证
  • RSA 非对称加密算法
  • SSL SSL加密 - https协议
  • DH 密钥一致协议
  • DSA 数字签名
  • ECC 椭圆曲线密码编码学

BASE64

严格地说,属于编码格式,而非加密算法,用于二进制内容转换为可编辑的文本内容。


Base64.jpg

按照RFC2045的定义,Base64被定义为:
Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

需要明文保存二进制数据时,可以将不可打印的二进制数据经过Base64编码转成可打印的字符串。

Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码。

Base64也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。

垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。

在LDIF档案,Base64用作编码字串。

编码后的内容,是由64个字符(大小写英文字母 0-9 + / (= 补位符,填充字符))组成的序列,成为Base64。可逆的编码方式。

Android中自带的Base64加密算法:
Android自身带有Base64加密与解密的包,可以方便地加密密码方便传输。

 String base64Token = Base64.encodeToString(token.trim().getBytes(), Base64.NO_WRAP);
 byte[] buffer = Base64.decode(base64Token,Base64.DEFAULT);

看起来用法与Java所带的sun.misc的Base64Encoder这些用法差不多,但应该留意到了,在encode的时候,会有一个参数Flags(即上面代码中的Base64.DEFAULT)这个参数有什么用呢?根据Android SDK的描述,这种参数有5个:

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

基本的单向加密算法

单项的加密,不能解密。
MD5(Message Digest algorithm 5,信息摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。

MD5.jpg

不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。

 // 获取一个信息加密的加密的摘要对象
 // getInstance需要传递一个算法的名称
 MessageDigest md = MessageDigest.getInstance(“MD5”);
MD5.png
MD5用户登录.jpg

SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)

MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。

我们通常只把他们作为加密的基础,单纯的以上三种的加密并不可靠。
MD5、SHA 可以通过暴力碰撞算法破解。

复杂的对称加密(DES、PBE)

DES(Data Encryption Standard,数据加密算法)
是IBM公司于1975年研究成功并公开发表的,是一种堆成加密算法.

DES.jpg

DES算法的入口参数有三个: Key、 Data、 Mode
其中Key为8个字节共64位,是DES算法的工作密钥;
Data也为8个字节64位,是要被加密或被解密的数据;
Mode为DES的工作方式,有两种:加密或解密。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。

PBE(Password-based encryption,基于密码验证)

非对称加密算法

RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

RSA1.jpg
RSA2.jpg
RSA3.jpg

这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。
这种加密算法的特点主要是密钥的变化,DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。
RSA同时有两把钥匙,公钥与私钥。
同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。

流程分析:
甲方构建密钥对儿,将公钥公布给乙方,将私钥保留。
甲方使用私钥加密数据,然后用私钥对加密后的数据签名,发送给乙方签名以及加密后的数据;
乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。
乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过私钥解密。

DH(Diffie-Hellman算法,密钥一致协议)
DSA(Digital Signature Algorithm,数字签名)
ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

SSL加密 - https协议

http 明文
https SSL加密
OpenSSL - ssl加密第三方的开源组件

安装数字证书
证书存放在浏览器中,在服务端也有对应证书的存根 。
访问网站时,通过证书进行加密。
服务器通过证书存根来对加密的数据进行解密。

使用

在Android开发中,一般只用到Base64,MD5,RSA,DES。

我们用Base64编码:大家要注意身体,不要熬夜写代码

String oldWord = "大家要注意身体,不要熬夜写代码";
        try {
            //编码
            String encodeWord = Base64.encodeToString(oldWord.getBytes("utf-8"), Base64.NO_WRAP);
            Log.i("Rair", " encode wrods = " + encodeWord);
            //解码
            String decodeWord = new String(Base64.decode(encodeWord, Base64.NO_WRAP), "utf-8");
            Log.i("Rair", "decode wrods = " + decodeWord);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

运行后得到:

10-19 00:11:18.062 5899-5899/com.rair.encrptdemo I/Rair:  encode wrods = 5aSn5a626KaB5rOo5oSP6Lqr5L2T77yM5LiN6KaB54as5aSc5YaZ5Luj56CB
10-19 00:11:18.062 5899-5899/com.rair.encrptdemo I/Rair: decode wrods = 大家要注意身体,不要熬夜写代码

具体用法可参考Demo
https://coding.net/u/Rair/p/RairDemo/git

https://github.com/Rairmmd/RairDemo

你可能感兴趣的:(Android)