非对称加密(不可互逆)
MD5
非对称加密算法。
优点:不可逆,压缩性,不容易修改,容易计算
缺点:穷举法可以破解
实现
- String2MD5
public static String string2MD5(String text) {
try {
//获取摘要器 MessageDigest
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
//通过摘要器对字符串的二进制字节数组进行hash计算
byte[] digest = messageDigest.digest(text.getBytes());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
//循环每个字符 将计算结果转化为正整数;
int digestInt = digest[i] & 0xff;
//将10进制转化为较短的16进制
String hexString = Integer.toHexString(digestInt);
//转化结果如果是个位数会省略0,因此判断并补0
if (hexString.length() < 2) {
sb.append(0);
}
//将循环结果添加到缓冲区
sb.append(hexString);
}
} catch (Exception e) {
e.printStackTrace();
}
//返回整个结果
return sb.toString();
}
- File2MD5
public static String file2MD5(File file) {
String value = null;
FileInputStream in = null;
try {
in = new FileInputStream(file);
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest());
value = bi.toString(16).toUpperCase(Locale.ENGLISH);//转为大写
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return value;
}
增加md5的安全性
- 对字符串多次MD5加密
- MD5加盐
string+key(盐值key)然后进行MD5加密
方式:- 用string明文的hashcode作为盐,然后进行MD5加密
- 随机生成一串字符串作为盐,然后进行MD5加密
SHA
非对称加密算法。安全散列算法,数字签名工具
优点:破解难度高,不可逆
缺点:可以通过穷举法进行破解
RSA
非对称加密算法,最流行的公钥密码算法,使用长度可变的秘钥
优点:不可逆,既能用于数据加密,也可以应用于数字签名
缺点:RSA非对称加密内容长度有限制,1024位key的最多只能加密127位数据
对称加密(可以互逆)
DES,3DES
对称加密算法
优点:算法公开、计算量小、加密速度快、加密效率高
缺点:双方都使用同样密钥,安全性得不到保证
3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密
AES
对称加密算法
优点:算法公开、计算量小、加密速度快、加密效率高
缺点:双方都使用同样密钥,安全性得不到保证
AES的出现本身就是为了取代DES的,AES具有比DES更好的安全性、效率、灵活性,所以对称加密优先采用AES。
Base64
算不上什么加密算法,只是对数据进行编码传输
XOR
异或加密:原字符与一个数值 k 进行异或运算得到结果 r ,则用 r 与 k 做异或运算即可还原到原字符
优点:两个变量的互换(不借助第三个变量),简单的数据加密
缺点:加密方式简单