加密算法
主要作用就是隐藏信息,让信息不可见,也用于提高网络访问的安全。
常见加密算法
- BASE64 用于二进制内容转换为可编辑的文本内容
- MD5 信息摘要算法
- SHA 安全散列算法
- HMAC 散列消息鉴别码
- DES 数据加密算法
- PBE 基于密码验证
- RSA 非对称加密算法
- SSL SSL加密 - https协议
- DH 密钥一致协议
- DSA 数字签名
- ECC 椭圆曲线密码编码学
BASE64
严格地说,属于编码格式,而非加密算法,用于二进制内容转换为可编辑的文本内容。
按照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后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。
// 获取一个信息加密的加密的摘要对象
// getInstance需要传递一个算法的名称
MessageDigest md = MessageDigest.getInstance(“MD5”);
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)
MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。
我们通常只把他们作为加密的基础,单纯的以上三种的加密并不可靠。
MD5、SHA 可以通过暴力碰撞算法破解。
复杂的对称加密(DES、PBE)
DES(Data Encryption Standard,数据加密算法)
是IBM公司于1975年研究成功并公开发表的,是一种堆成加密算法.
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)
这种算法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