前言
按加密结果是否可以被解密分为可逆和不可逆:
1,不可逆:
MD5(Message-Digest消息摘要):不可逆,长度固定(32位),容易计算,仅一字节只差加密结果都会有很大区别
通常情况下为了让加密过程变得不可预测,我们会进行加盐操作。
SHA:安全散列算法,数字签名工具 , 长度比MD5要长,所以更安全,但是加密的效率要比MD5慢一些.
2,可逆:
按秘钥数量和加密规则分为:对称加密和非对称加密
1,对称加密:即通过key加密,也可以通过key来解密
优点:算法公开、计算量小、加密速度快、加密效率高 缺点:双方都使用同样的密钥,密钥可以自己指定,并且只有一把,如果密钥泄漏数据就会被解密
DES,AES
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,Android 中的AES 加密 秘钥 key 必须为16/24/32位字节,否则抛异常。
2,非对称加密:如RSA加密算法公钥加密只能私钥解密,私钥加密也只能公钥解密
RSA :他有两把密钥,且是由程序生成的,不能自己指定;
特点是加密速度比较慢,但是安全性比较高;
加密和解密的规则是:公钥加密只能私钥解密,私钥加密只能公钥解密;
RSA对加密数据的长度有限制,一般为密钥的长度值-11,要加密较长的数据,可以采用数据截取的方法,分段加密。
RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。
MD5加密
使用场景:
1.验证密码:只要算法不变,就能和服务器上的MD5匹配;
2.文件完整性的校验:当下载一个文件时,服务器返回的信息包括这个文件的md5,在本地下载完毕时进行md5加密,将两个md5值进行比较,如果一致则说明文件完整没有丢包现象。
/**
* 使用md5方式进行加密
* @return
*/
public static String digest(String content){
StringBuilder builder = new StringBuilder();
try {
MessageDigest msgDitest = MessageDigest.getInstance( MD5
msgDitest.update(content.getBytes());
byte[] digests = msgDitest.digest();
//将每个字节转为16进制
for (int i=0;i digests.length;i++){
builder.append(Integer.toHexString(digests[i] 0xff +8));//+8为加盐操作
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return builder.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SHA:
著名的图片加载框架Glide在缓存key时就采用的此加密
文件的秒传功能,以及相同的v4包冲突都是可以根据sha1值进行比对的
/**
* 使用sha-1方式进行加密
* @return
*/
public static String digest(String content){
StringBuilder builder = new StringBuilder();
try {
MessageDigest msgDitest = MessageDigest.getInstance( SHA-1
msgDitest.update(content.getBytes());
byte[] digests = msgDitest.digest();
//将每个字节转为16进制
for (int i=0;i digests.length;i++){
builder.append(Integer.toHexString(digests[i] 0xff +8));//+8为加盐操作
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return builder.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DES
String data = 我是俊哥
String desKey = 青龙偃月刀 // 密钥,口号
boolean isDesEncrypt = false;
private void useDes() {
try {
if(isDesEncrypt){
//解密
text.setText(Des.decrypt(text.getText().toString(), desKey));
}else {
//加密
text.setText(Des.encrypt(data, desKey));
}
isDesEncrypt = !isDesEncrypt;
} catch (Exception e) {
e.printStackTrace();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
AES
AES加密是一种高级加密标准,是一种区块加密标准。它是一个对称密码,就是说加密和解密用相同的密钥。WPA/WPA2经常用的加密方式就是AES加密算法。
public class AESUtils3 {
/* 算法/模式/填充 */
private static final String CipherMode = AES/ECB/PKCS5Padding
/* 创建密钥 */
private static SecretKeySpec createKey(String password) {
byte[] data = null;
if (password == null) {
password =
}
StringBuffer sb = new StringBuffer(32);
sb.append(password);
while (sb.length() 32) {
sb.append( 0
}
if (sb.length() 32) {
sb.setLength(32);
}
try {
姓名:
年龄:
电话: